This is what i have so far:
package de.inplus.umsys.web.observer.tools; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.Set; import org.springframework.beans.factory.annotation.Required; import org.springframework.core.io.Resource; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PRStream; import com.itextpdf.text.pdf.PdfArray; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfDictionary; import com.itextpdf.text.pdf.PdfGState; import com.itextpdf.text.pdf.PdfLayer; import com.itextpdf.text.pdf.PdfName; import com.itextpdf.text.pdf.PdfNumber; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.PdfWriter; public class WatermarkTool { private Resource watermark; public void setWatermarkRight(File document, boolean shouldBeMarked) throws Exception { try { byte[] buffer = new byte[(int) document.length()]; InputStream in = new FileInputStream(document); in.read(buffer); in.close(); PdfReader reader = new PdfReader(buffer); PdfDictionary pageDict; int n = reader.getNumberOfPages(); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream( document)); Map<String, PdfLayer> layers = stamper.getPdfLayers(); boolean wm = false; if (!layers.isEmpty()) { Set<String> keys = layers.keySet(); for (String key : keys) { if (key.toString().equalsIgnoreCase("watermark")) wm = true; } } if ((shouldBeMarked==true)&&(wm==false)) { addWatermarkLayer(reader, stamper); } if((shouldBeMarked ==false)&&(wm==true)) { removeWatermark(reader, stamper); } stamper.close(); } catch (Exception e) { throw e; } finally { } } private void addWatermarkLayer(PdfReader reader, PdfStamper stamper) throws Exception { Image watermarkImage = Image.getInstance(watermark.getFile().getPath()); PdfLayer wmLayer = new PdfLayer("watermark", stamper.getWriter()); wmLayer.setOnPanel(true); // set layer parameters wmLayer.setPrint("print", true); wmLayer.setOn(true); wmLayer.setView(true); // Prepare transperancy PdfGState transparent = new PdfGState(); transparent.setStrokeOpacity(0.4f); transparent.setFillOpacity(0.4f); PdfContentByte cb; int toPage = stamper.getReader().getNumberOfPages(); for (int i = 1; i <= toPage; i++) { cb = stamper.getUnderContent(i); Rectangle rectangle = stamper.getReader() .getPageSizeWithRotation(i); cb.beginLayer(wmLayer); cb.setGState(transparent); // set block trasparency properties // position relative to top watermarkImage.scaleAbsoluteHeight(rectangle.getHeight() - 20); watermarkImage.scaleAbsoluteWidth(rectangle.getWidth() - 20); float absoluteY = rectangle.getBottom() + (rectangle.getHeight() - watermarkImage.getPlainHeight() - 10); watermarkImage.setAbsolutePosition(10, 10); cb.addImage(watermarkImage); cb.endLayer(); } } public void removeWatermark(PdfReader reader, PdfStamper stamper){ try { PdfDictionary root = reader.getCatalog(); root.remove(PdfName.OCPROPERTIES); PdfDictionary page; PdfArray contentarray; PRStream stream; String content; PdfDictionary resources; PdfDictionary xobjects; for (int i = 0; i < reader.getNumberOfPages(); i++) { page = reader.getPageN(1); contentarray = page.getAsArray(PdfName.CONTENTS); if (contentarray != null) { for (int j = 0; j < contentarray.size(); j++) { stream = (PRStream) contentarray.getAsStream(j); content = new String(PdfReader.getStreamBytes(stream)); if (content.indexOf("/OC") > 0) { stream.put(PdfName.LENGTH, new PdfNumber(0)); stream.setData(new byte[0]); } } } resources = page.getAsDict(PdfName.RESOURCES); xobjects = resources.getAsDict(PdfName.XOBJECT); for (PdfName name : xobjects.getKeys()) { stream = (PRStream) xobjects.getAsStream(name); if (stream.get(PdfName.OC) == null) { continue; } stream.put(PdfName.LENGTH, new PdfNumber(0)); stream.setData(new byte[0]); } } stamper.setViewerPreferences(PdfWriter.PageModeUseNone); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Resource getWatermark() { return watermark; } @Required public void setWatermark(Resource watermark) { this.watermark = watermark; } } it is almost perfect. just one last problem: by watermark removes layer content but not the layer itself. If i understand this right, i have to remove something else from the PdfDictionary? Can somebody pleas write me exactly what? -- View this message in context: http://itext-general.2136553.n4.nabble.com/iText-how-to-remove-the-layer-watermark-tp3576811p3604883.html Sent from the iText - General mailing list archive at Nabble.com. ------------------------------------------------------------------------------ EditLive Enterprise is the world's most technically advanced content authoring tool. Experience the power of Track Changes, Inline Image Editing and ensure content is compliant with Accessibility Checking. http://p.sf.net/sfu/ephox-dev2dev _______________________________________________ iText-questions mailing list iText-questions@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/itext-questions iText(R) is a registered trademark of 1T3XT BVBA. Many questions posted to this list can (and will) be answered with a reference to the iText book: http://www.itextpdf.com/book/ Please check the keywords list before you ask for examples: http://itextpdf.com/themes/keywords.php