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.

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.

this subtle difference, thought you'd want know.
if want read answer in french, please read comment créer un filigrane transparent en pdf?