2015-09-08 191 views
3

我正在使用PDFBox,我想知道是否可以添加文件作为附件并链接到它?如何将链接添加到PDF文档的文件附件

我们可以使用下面的代码https://svn.apache.org/viewvc/pdfbox/tags/1.8.9/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/EmbeddedFiles.java为例:

 ... 
     // 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); 
     ... 

回答

2

你可以用 “PDAnnotationFileAttachment” 尝试。它会提供一个注释。通过点击注释,您可以打开附件。

示例代码:

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(); 
    } 

}