📜  PDFBox处理附件

📅  最后修改于: 2021-01-07 07:42:57             🧑  作者: Mango

PDFBox处理附件

PDF文档可以包含通过文件系统对外部文件的引用或对远程位置的URL。也可以二进制文件嵌入到PDF文档中。

一个Apache PDFBox的提供下列,可以在引用文件中使用。

Class Discription
PDSimpleFileSpecification It is a simple string reference to a file. The PDSimpleFileSpecification class does not allow for any parameters to be set.
PDComplexFileSpecification It is more feature rich class and allows for advanced settings for reference to a file.

在PDFBox中,也可以将文件直接嵌入PDF文档中。这可以通过使用EmbeddedFile属性而不是设置PDComplexFileSpecification类的file属性来执行。

将文件嵌入PDF文档

PDF文档可以包含文件附件。可从“文档”->“文件附件”菜单访问文件附件。 PDFBox允许我们在PDF文档中添加附件,也可以从PDF文档中提取附件。在PDFBox中,附件是附加到文档目录的命名树的一部分。

以下是将附件添加到PDF文件的分步过程。

加载现有文档

我们可以使用static load()方法加载现有的PDF文档。此方法接受文件对象作为参数。我们还可以使用PDFBox的类名PDDocument调用它。

File file = new File("PATH"); 
PDDocument doc = PDDocument.load(file); 

实例化PDDocumentNameDictionary

在此,附件作为“名称”字典的一部分存储在文档目录中。

PDDocumentNameDictionary names = new DdocumentNameDictionary (doc.getDocumentCatalog());

检索现有附件并添加新附件

PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles();
 Map existedNames = efTree.getNames();

创建文件规范,其中包含嵌入式文件

PDComplexFileSpecification fs = new PDComplexFileSpecification();
        fs.setFile( "Test.txt" );
        InputStream is = ...;
        PDEmbeddedFile ef = new PDEmbeddedFile(doc, is );

例-

import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.*;

public class AddingAttachments {
    public static void main(String[] args)throws IOException {
                
        try (final 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("Go to Document -> File Attachments to View Embedded Files");
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 fs = new PDComplexFileSpecification();
fs.setFile("example-document.txt");

// create a dummy file stream, this would probably normally be a FileInputStream
byte[] data = "This is the contents of the embedded file".getBytes("ISO-8859-1");
            ByteArrayInputStream fakeFile = new ByteArrayInputStream(data);

// now lets some of the optional parameters
            PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile);
ef.setSubtype("text/plain");
ef.setSize(data.length);
ef.setCreationDate(Calendar.getInstance());
fs.setEmbeddedFile(ef);

// 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
            Listkids = new ArrayList();
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);

doc.save(new File("/eclipse-workspace/embedded-file.pdf"));
            System.out.println("Embaded PDF file is created");
        } catch (IOException e){
       System.err.println("Exception while trying to create pdf document - " + e);
      }
   }
}

输出: