让我首先重写您的代码以添加嵌入文件。
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
PdfFileSpecification fs = PdfFileSpecification.fileEmbedded(
stamper.getWriter(), null, "test.txt", "Some test".getBytes());
stamper.addFileAttachment("some test file", fs);
stamper.close();
}
您可以在这里找到完整的代码示例:添加嵌入文件
现在,当我们查看生成的 PDF 的“附件”面板时,我们会看到一个附件 test.txt,其描述为“某个测试文件”:
![enter image description here](https://i.stack.imgur.com/msguq.jpg)
添加此文件后,您现在想要将其删除。为此,请使用 RUPS 并查看内部:
![enter image description here](https://i.stack.imgur.com/WdUcG.jpg)
这给了我们在哪里找到嵌入文件的提示。看一下代码删除嵌入文件示例来了解我们如何浏览 PDF 的面向对象文件格式:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfDictionary root = reader.getCatalog();
PdfDictionary names = root.getAsDict(PdfName.NAMES);
PdfDictionary embeddedFiles = names.getAsDict(PdfName.EMBEDDEDFILES);
PdfArray namesArray = embeddedFiles.getAsArray(PdfName.NAMES);
namesArray.remove(0);
namesArray.remove(0);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
}
正如您所看到的,我们从文档的根部(也称为目录)开始,然后遍历Names
and EmbeddedFiles
to the Names
大批。据我所知,我要删除的嵌入文件是数组中的第一个文件,因此我通过删除索引为 0 的元素两次来删除名称和值。这首先删除描述,然后删除对文件的引用。附件现已消失:
![enter image description here](https://i.stack.imgur.com/bZXJt.jpg)
由于我的示例中只有一个嵌入文件,因此当我查看 PDF 内部时,我现在看到一个空数组:
![enter image description here](https://i.stack.imgur.com/ASCUD.jpg)
如果您想一次删除所有嵌入的文件,代码就更简单了。这显示在删除嵌入文件例子:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfDictionary root = reader.getCatalog();
PdfDictionary names = root.getAsDict(PdfName.NAMES);
names.remove(PdfName.EMBEDDEDFILES);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
}
现在我们甚至不看EmbeddedFiles
字典。已经没有这样的条目了Names
字典:
![enter image description here](https://i.stack.imgur.com/RaKIC.jpg)