PDFBox 处理附件

PDFBox 处理附件 介绍

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

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

Class类 描述
PDSimpleFileSpecification 它是对文件的简单字符串引用。PDSimpleFileSpecification 类不允许设置任何参数。
PDComplexFileSpecification 它是功能更丰富的类,并允许用于引用文件的高级设置。

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

PDFBox 将文件嵌入 PDF 文档

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

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

第1步:加载现有文档

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

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

第2步:实例化 PDDocumentNameDictionary

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

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

第3步:检索现有附件并添加新附件

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

第4步:创建FileSpecification,包含嵌入的文件

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

PDFBox 处理附件 完整示例

package com.yiidian;

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.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

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

            doc.save(new File("d:/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);
        }
    }
}  

输出结果如下:

热门文章

优秀文章