You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2021/04/20 15:51:30 UTC

svn commit: r1889021 - /pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java

Author: tilman
Date: Tue Apr 20 15:51:30 2021
New Revision: 1889021

URL: http://svn.apache.org/viewvc?rev=1889021&view=rev
Log:
PDFBOX-5164: add example

Added:
    pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java   (with props)

Added: pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java?rev=1889021&view=auto
==============================================================================
--- pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java (added)
+++ pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java Tue Apr 20 15:51:30 2021
@@ -0,0 +1,210 @@
+package org.apache.pdfbox.examples.pdmodel;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
+import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.PageMode;
+import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
+import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+
+/**
+ * This is an example on how to create a portable collection PDF, as described in the PDF 1.7
+ * specification in chapter 12.3.5. It uses the COS methods because there are not any PD classes
+ * yet. If you want to help, we'd need PDCollection, PDCollectionField, PDCollectionSort and
+ * PDCollectionItem.
+ *
+ * @author Tilman Hausherr
+ */
+public class CreatePortableCollection
+{
+
+    /**
+     * Constructor.
+     */
+    private CreatePortableCollection()
+    {
+    }
+
+    /**
+     * Create a portable collection PDF with two files.
+     *
+     * @param file The file to write the PDF to.
+     *
+     * @throws IOException If there is an error writing the data.
+     */
+    public void doIt(String file) throws IOException
+    {
+        PDDocument doc = new PDDocument();
+        PDPage page = new PDPage();
+        doc.addPage(page);
+
+        PDPageContentStream contentStream = new PDPageContentStream(doc, page);
+        contentStream.beginText();
+        contentStream.setFont(PDType1Font.HELVETICA, 12);
+        contentStream.newLineAtOffset(100, 700);
+        contentStream.showText("Example of a portable collection");
+        contentStream.endText();
+        contentStream.close();
+
+        //embedded files are stored in a named tree
+        PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
+
+        //first create the file specification, which holds the embedded file
+        PDComplexFileSpecification fs1 = new PDComplexFileSpecification();
+
+        // use both methods for backwards, cross-platform and cross-language compatibility.
+        fs1.setFile("Test1.txt");
+        fs1.setFileUnicode("Test1.txt");
+
+        //create a dummy file stream, this would probably normally be a FileInputStream
+        byte[] data1 = "This is the contents of the first embedded file".getBytes(StandardCharsets.ISO_8859_1);
+        PDEmbeddedFile ef1 = new PDEmbeddedFile(doc, new ByteArrayInputStream(data1), COSName.FLATE_DECODE);
+        //now lets some of the optional parameters
+        ef1.setSubtype("text/plain");
+        ef1.setSize(data1.length);
+        ef1.setCreationDate(new GregorianCalendar());
+
+        // use both methods for backwards, cross-platform and cross-language compatibility.
+        fs1.setEmbeddedFile(ef1);
+        fs1.setEmbeddedFileUnicode(ef1);
+        fs1.setFileDescription("The first file");
+
+        //first create the file specification, which holds the embedded file
+        PDComplexFileSpecification fs2 = new PDComplexFileSpecification();
+
+        // use both methods for backwards, cross-platform and cross-language compatibility.
+        fs2.setFile("Test2.txt");
+        fs2.setFileUnicode("Test2.txt");
+
+        //create a dummy file stream, this would probably normally be a FileInputStream
+        byte[] data2 = "This is the contents of the second embedded file".getBytes(StandardCharsets.ISO_8859_1);
+        PDEmbeddedFile ef2 = new PDEmbeddedFile(doc, new ByteArrayInputStream(data2), COSName.FLATE_DECODE);
+        //now lets some of the optional parameters
+        ef2.setSubtype("text/plain");
+        ef2.setSize(data2.length);
+        ef2.setCreationDate(new GregorianCalendar());
+
+        // use both methods for backwards, cross-platform and cross-language compatibility.
+        fs2.setEmbeddedFile(ef2);
+        fs2.setEmbeddedFileUnicode(ef2);
+        fs2.setFileDescription("The second file");
+
+        Map<String, PDComplexFileSpecification> map = new HashMap<String, PDComplexFileSpecification>();
+        map.put("Attachment 1", fs1);
+        map.put("Attachment 2", fs2);
+
+        // create a new tree node and add the embedded file
+        PDEmbeddedFilesNameTreeNode treeNode = new PDEmbeddedFilesNameTreeNode();
+        treeNode.setNames(map);
+        // add the new node as kid to the root node
+        List<PDEmbeddedFilesNameTreeNode> kids = new ArrayList<PDEmbeddedFilesNameTreeNode>();
+        kids.add(treeNode);
+        efTree.setKids(kids);
+
+        // add the tree to the document catalog
+        PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog());
+        names.setEmbeddedFiles(efTree);
+        doc.getDocumentCatalog().setNames(names);
+
+        // show attachments panel in some viewers 
+        doc.getDocumentCatalog().setPageMode(PageMode.USE_ATTACHMENTS);
+
+        // create collection directory
+        COSDictionary collectionDic = new COSDictionary();
+        COSDictionary schemaDict = new COSDictionary();
+        schemaDict.setItem(COSName.TYPE, COSName.COLLECTION_SCHEMA);
+        COSDictionary sortDic = new COSDictionary();
+        sortDic.setItem(COSName.TYPE, COSName.COLLECTION_SORT);
+        sortDic.setString(COSName.A, "true"); // sort ascending
+        // "it identifies a field described in the parent collection dictionary"
+        // sort by field 2
+        sortDic.setItem(COSName.S, COSName.getPDFName("fieldtwo"));
+        collectionDic.setItem(COSName.TYPE, COSName.COLLECTION);
+        collectionDic.setItem(COSName.SCHEMA, schemaDict);
+        collectionDic.setItem(COSName.SORT, sortDic);
+        collectionDic.setItem(COSName.VIEW, COSName.D); // Details mode
+        COSDictionary fieldDict1 = new COSDictionary();
+        fieldDict1.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
+        fieldDict1.setItem(COSName.SUBTYPE, COSName.S); // type: text field
+        fieldDict1.setString(COSName.N, "field header one (description)"); // header text
+        fieldDict1.setInt(COSName.O, 1); // order on the screen
+        COSDictionary fieldDict2 = new COSDictionary();
+        fieldDict2.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
+        fieldDict2.setItem(COSName.SUBTYPE, COSName.S); // type: text field
+        fieldDict2.setString(COSName.N, "field header two (name)");
+        fieldDict2.setInt(COSName.O, 2);
+        COSDictionary fieldDict3 = new COSDictionary();
+        fieldDict3.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
+        fieldDict3.setItem(COSName.SUBTYPE, COSName.N); // type: number field
+        fieldDict3.setString(COSName.N, "field header three (size)");
+        fieldDict3.setInt(COSName.O, 3);
+        schemaDict.setItem("fieldone", fieldDict1); // field name (this is a key)
+        schemaDict.setItem("fieldtwo", fieldDict2);
+        schemaDict.setItem("fieldthree", fieldDict3);
+        doc.getDocumentCatalog().getCOSObject().setItem(COSName.COLLECTION, collectionDic);
+        doc.getDocumentCatalog().setVersion("1.7");
+
+        // collection item dictionary with fields for 1st file
+        COSDictionary ciDict1 = new COSDictionary();
+        ciDict1.setItem(COSName.TYPE, COSName.COLLECTION_ITEM);
+        // use the field names from earlier
+        ciDict1.setString("fieldone", fs1.getFileDescription());
+        ciDict1.setString("fieldtwo", fs1.getFile());
+        ciDict1.setInt("fieldthree", fs1.getEmbeddedFile().getSize());
+        fs1.getCOSObject().setItem(COSName.CI, ciDict1);
+
+        // collection item dictionary with fields for 2nd file
+        COSDictionary ciDict2 = new COSDictionary();
+        ciDict2.setItem(COSName.TYPE, COSName.COLLECTION_ITEM);
+        // use the field names from earlier
+        ciDict2.setString("fieldone", fs2.getFileDescription());
+        ciDict2.setString("fieldtwo", fs2.getFile());
+        ciDict2.setInt("fieldthree", fs2.getEmbeddedFile().getSize());
+        fs2.getCOSObject().setItem(COSName.CI, ciDict2);
+
+        doc.save(file);
+        doc.close();
+    }
+
+    /**
+     * This will create a portable collection PDF.
+     * <br>
+     * see usage() for commandline
+     *
+     * @param args Command line arguments.
+     */
+    public static void main(String[] args) throws IOException
+    {
+        CreatePortableCollection app = new CreatePortableCollection();
+        if (args.length != 1)
+        {
+            app.usage();
+        }
+        else
+        {
+            app.doIt(args[0]);
+        }
+    }
+
+    /**
+     * This will print out a message telling how to use this example.
+     */
+    private void usage()
+    {
+        System.err.println("usage: " + this.getClass().getName() + " <output-file>");
+    }
+}

Propchange: pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/CreatePortableCollection.java
------------------------------------------------------------------------------
    svn:eol-style = native