PDFBox使用附件

PDF文档可以包含通过文件系统对外部文件的引用或对远程位置的URL。也可以将二进制文件嵌入到PDF文档中。
Apache PDFBox提供了以下可用于引用文件的类。

PDFBox使用附件

文章图片
Class Discription
PDSimpleFileSpecification 它是对文件的简单字符串引用。 PDSimpleFileSpecification类不允许设置任何参数。
PDComplexFileSpecification 它是功能更丰富的类, 并允许高级设置以引用文件。
在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 = "http://www.srcmini.com/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("/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); } } }

【PDFBox使用附件】输出
PDFBox使用附件

文章图片

    推荐阅读