questions.ocg.AddOptionalContentToExistingPdf.java Source code

Java tutorial

Introduction

Here is the source code for questions.ocg.AddOptionalContentToExistingPdf.java

Source

/*
 * This example was written by Bruno Lowagie, author of the book
 * 'iText in Action' by Manning Publications (ISBN: 1932394796).
 * You can use this example as inspiration for your own applications.
 * The following license applies:
 * http://www.1t3xt.com/about/copyright/index.php?page=MIT
 */

package questions.ocg;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfLayer;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;

public class AddOptionalContentToExistingPdf {
    public static final String RESULT01 = "results/questions/ocg/ocg_empty.pdf";
    public static final String RESULT02 = "results/questions/ocg/ocg_from_empty.pdf";
    public static final String RESULT03 = "results/questions/ocg/ocg_from_existing.pdf";

    public static void main(String[] args) throws IOException, DocumentException {
        // creating an empty document
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT01));
        writer.setPdfVersion(PdfWriter.VERSION_1_5);
        document.open();
        writer.setPageEmpty(false);
        document.close();

        PdfReader reader = new PdfReader(RESULT01);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT02));
        PdfContentByte cb = stamper.getOverContent(1);
        writer = stamper.getWriter();
        PdfLayer nested = new PdfLayer("Nested Layers", writer);
        PdfLayer nested_1 = new PdfLayer("Nested Layer 1", writer);
        PdfLayer nested_2 = new PdfLayer("Nested Layer 2", writer);
        PdfLayer layer21 = new PdfLayer("Layer 2", writer);
        PdfLayer layer22 = new PdfLayer("Layer 2", writer);
        nested_2.addChild(layer21);
        nested_2.addChild(layer22);
        nested.addChild(nested_1);
        nested.addChild(nested_2);
        cb.beginLayer(nested);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("nested layers"), 50, 775, 0);
        cb.endLayer();
        cb.beginLayer(nested_1);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("nested layer 1"), 100, 800, 0);
        cb.endLayer();
        cb.beginLayer(nested_2);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("nested layer 2"), 100, 750, 0);
        cb.endLayer();
        cb.beginLayer(layer21);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("layer 2.1 in the group"), 150, 775, 0);
        cb.endLayer();
        cb.beginLayer(layer22);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("layer 2.2 in the group"), 150, 725, 0);
        cb.endLayer();
        PdfLayer group = PdfLayer.createTitle("Grouped layers", writer);
        PdfLayer layer1 = new PdfLayer("Group: layer 1", writer);
        PdfLayer layer2 = new PdfLayer("Group: layer 2", writer);
        group.addChild(layer1);
        group.addChild(layer2);
        cb.beginLayer(layer1);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("layer 1 in the group"), 50, 700, 0);
        cb.endLayer();
        cb.beginLayer(layer2);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("layer 2 in the group"), 50, 675, 0);
        cb.endLayer();
        PdfLayer radiogroup = PdfLayer.createTitle("Radio Group", writer);
        PdfLayer radio1 = new PdfLayer("Radiogroup: layer 1", writer);
        radio1.setOn(true);
        PdfLayer radio2 = new PdfLayer("Radiogroup: layer 2", writer);
        radio2.setOn(false);
        PdfLayer radio3 = new PdfLayer("Radiogroup: layer 3", writer);
        radio3.setOn(false);
        radiogroup.addChild(radio1);
        radiogroup.addChild(radio2);
        radiogroup.addChild(radio3);
        ArrayList<PdfLayer> options = new ArrayList<PdfLayer>();
        options.add(radio1);
        options.add(radio2);
        options.add(radio3);
        writer.addOCGRadioGroup(options);
        cb.beginLayer(radio1);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("option 1"), 50, 600, 0);
        cb.endLayer();
        cb.beginLayer(radio2);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("option 2"), 50, 575, 0);
        cb.endLayer();
        cb.beginLayer(radio3);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, new Phrase("option 3"), 50, 550, 0);
        cb.endLayer();
        PdfLayer not_printed = new PdfLayer("not printed", writer);
        not_printed.setOnPanel(false);
        not_printed.setPrint("Print", false);
        cb.beginLayer(not_printed);
        ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, new Phrase("PRINT THIS PAGE"), 300, 700, 90);
        cb.endLayer();
        PdfLayer zoom = new PdfLayer("Zoom 0.75-1.25", writer);
        zoom.setOnPanel(false);
        zoom.setZoom(0.75f, 1.25f);
        cb.beginLayer(zoom);
        ColumnText.showTextAligned(cb, Element.ALIGN_LEFT,
                new Phrase("Only visible if the zoomfactor is between 75 and 125%"), 30, 530, 90);
        cb.endLayer();
        stamper.close();

        reader = new PdfReader(RESULT02);
        stamper = new PdfStamper(reader, new FileOutputStream(RESULT03));
        Map ocg = stamper.getPdfLayers();
        for (Iterator i = ocg.keySet().iterator(); i.hasNext();) {
            System.out.println(i.next());
        }
        PdfLayer layer = (PdfLayer) ocg.get("Layer 2");
        layer.setOn(false);
        cb = stamper.getOverContent(1);
        cb.beginLayer(layer);
        cb.moveTo(0, 0);
        cb.lineTo(500, 500);
        cb.stroke();
        cb.endLayer();
        PdfLayer parent = (PdfLayer) ocg.get("Layer 2(2)");
        PdfLayer newLayer = new PdfLayer("Child layer", stamper.getWriter());
        newLayer.setOn(false);
        parent.addChild(newLayer);
        cb.beginLayer(newLayer);
        cb.moveTo(0, 500);
        cb.lineTo(500, 0);
        cb.stroke();
        cb.endLayer();
        stamper.close();
    }
}