java - How to watermark PDFs using text or images? -


i have bunch of pdf documents in folder , want augment them watermark. options java serverside context?

preferably watermark support transparency. both vector , raster desirable.

please take @ transparentwatermark2 example. adds transparent text on each odd page , transparent image on each page of existing pdf document.

this how it's done:

public void manipulatepdf(string src, string dest) throws ioexception, documentexception {     pdfreader reader = new pdfreader(src);     int n = reader.getnumberofpages();     pdfstamper stamper = new pdfstamper(reader, new fileoutputstream(dest));     // text watermark     font f = new font(fontfamily.helvetica, 30);     phrase p = new phrase("my watermark (text)", f);     // image watermark     image img = image.getinstance(img);     float w = img.getscaledwidth();     float h = img.getscaledheight();     // transparency     pdfgstate gs1 = new pdfgstate();     gs1.setfillopacity(0.5f);     // properties     pdfcontentbyte over;     rectangle pagesize;     float x, y;     // loop on every page     (int = 1; <= n; i++) {         pagesize = reader.getpagesizewithrotation(i);         x = (pagesize.getleft() + pagesize.getright()) / 2;         y = (pagesize.gettop() + pagesize.getbottom()) / 2;         on = stamper.getovercontent(i);         over.savestate();         over.setgstate(gs1);         if (i % 2 == 1)             columntext.showtextaligned(over, element.align_center, p, x, y, 0);         else             over.addimage(img, w, 0, 0, h, x - (w / 2), y - (h / 2));         over.restorestate();     }     stamper.close();     reader.close(); } 

as can see, create phrase object text , image object image. create pdfgstate object transparency. in our case, go 50% opacity (change 0.5f else experiment).

once have these objects, loop on every page. use pdfreader object information existing document, instance dimensions of every page. use pdfstamper object when want stamp content on existing document, instance adding watermark on top of each single page.

when changing graphics state, safe perform savestate() before start , restorestate() once you're finished. code work if don't this, believe me: can save plenty of debugging time if adopt discipline can strange effects if graphics state out of balance.

we apply transparency using setgstate() method , depending on whether page odd page or page, add text (using columntext , (x, y) coordinate calculated text added in middle of each page) or image (using addimage() method , appropriate parameters transformation matrix).

once you've done every page in document, have close() stamper , reader.

caveat:

you'll notice pages 3 , 4 in landscape, yet there difference between 2 pages isn't visible naked eye. page 3 page of size defined if page in portrait, rotated 90 degrees. page 4 page of size defined in such way width > height.

this can have impact on way add watermark, if use getpagesizewithrotation(), itext adapt. may not want: maybe want watermark added differently.

take @ transparentwatermark3:

public void manipulatepdf(string src, string dest) throws ioexception, documentexception {     pdfreader reader = new pdfreader(src);     int n = reader.getnumberofpages();     pdfstamper stamper = new pdfstamper(reader, new fileoutputstream(dest));     stamper.setrotatecontents(false);     // text watermark     font f = new font(fontfamily.helvetica, 30);     phrase p = new phrase("my watermark (text)", f);     // image watermark     image img = image.getinstance(img);     float w = img.getscaledwidth();     float h = img.getscaledheight();     // transparency     pdfgstate gs1 = new pdfgstate();     gs1.setfillopacity(0.5f);     // properties     pdfcontentbyte over;     rectangle pagesize;     float x, y;     // loop on every page     (int = 1; <= n; i++) {         pagesize = reader.getpagesize(i);         x = (pagesize.getleft() + pagesize.getright()) / 2;         y = (pagesize.gettop() + pagesize.getbottom()) / 2;         on = stamper.getovercontent(i);         over.savestate();         over.setgstate(gs1);         if (i % 2 == 1)             columntext.showtextaligned(over, element.align_center, p, x, y, 0);         else             over.addimage(img, w, 0, 0, h, x - (w / 2), y - (h / 2));         over.restorestate();     }     stamper.close();     reader.close(); } 

in case, don't use getpagesizewithrotation() getpagesize(). tell stamper not compensate existing page rotation: stamper.setrotatecontents(false);

take @ difference in resulting pdfs:

in first screen shot (showing page 3 , 4 of resulting pdf of transparentwatermark2), page left page in portrait rotated 90 degrees. itext however, treats if page in landscape page right.

enter image description here

in second screen shot (showing page 3 , 4 of resulting pdf of transparentwatermark3), page left page in portrait rotated 90 degrees , add watermark if page in portrait. result, watermark rotated 90 degrees. doesn't happen page right, because page has rotation of 0 degrees.

enter image description here

this subtle difference, thought you'd want know.

if want read answer in french, please read comment créer un filigrane transparent en pdf?


Popular posts from this blog

debugging - Reference - What does this error mean in PHP? -

How to parse output from sse.client in Python? -