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

Reply via email to