3
votes

I'm using PDFBox and I wonder if it possible to add file as an attachment and also link to it?

We use the following code https://svn.apache.org/viewvc/pdfbox/tags/1.8.9/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/EmbeddedFiles.java as an example:

        ...
        // create a new tree node and add the embedded file 
        PDEmbeddedFilesNameTreeNode treeNode = new PDEmbeddedFilesNameTreeNode();
        treeNode.setNames( Collections.singletonMap( "My first attachment",  fs ) );
        // 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 );
        ...
1

1 Answers

4
votes

You can try with "PDAnnotationFileAttachment". It will provide an annotation. by clicking on annotation, you can open the attached file.

Sample code:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
import org.apache.pdfbox.pdmodel.graphics.color.PDGamma;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment;

public class FileAttach {

    public static void main(String arg[]) throws IOException, COSVisitorException
    {
        PDDocument doc = new PDDocument();
        PDPage page = new PDPage();
        doc.addPage(page);

        // Adding attachment
        String caption = "DEMO.mp4";
//        PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
//        final Map<String, PDComplexFileSpecification> embeddedFileMap = new HashMap<String, PDComplexFileSpecification>();

        PDComplexFileSpecification fs = new PDComplexFileSpecification();
        File f1 = new File("C:\\PDF\\DEMO.mp4");
        FileInputStream fins1 = new FileInputStream(f1);
        PDEmbeddedFile ef = new PDEmbeddedFile(doc, fins1 );
        ef.setSubtype( "application/octet-stream" );
        fs.setEmbeddedFile( ef );
        fs.setFile(caption);
//        embeddedFileMap.put(caption, fs);

//        efTree.setNames(embeddedFileMap);

//        PDDocumentNameDictionary nameDir = new PDDocumentNameDictionary( doc.getDocumentCatalog() );
//        nameDir.setEmbeddedFiles( efTree );
//        doc.getDocumentCatalog().setNames( nameDir );

        int offsetX = 20;
        int offsetY = 600;

        //PDAnnotationLink txtLink = new PDAnnotationLink();
        PDAnnotationFileAttachment txtLink = new PDAnnotationFileAttachment();
        txtLink.setFile(fs);
        PDGamma blueColor = new PDGamma();
        blueColor.setB(1);
        txtLink.setColour(blueColor);
        txtLink.setAnnotationFlags(PDAnnotationFileAttachment.FLAG_LOCKED);

        // Set the rectangle containing the link
        PDRectangle position = new PDRectangle();
        position.setLowerLeftX(offsetX);
        position.setLowerLeftY(offsetY);  
        position.setUpperRightX(offsetX + 20);
        position.setUpperRightY(offsetY + 20);
        txtLink.setRectangle(position);

        page.getAnnotations().add(txtLink);

        doc.save("C:\\PDF\\Vishal\\aa.pdf");
        doc.close();
    }

}