我是pdf的新手,我使用以下代码将文件嵌入到pdf中。但是,我想编写另一个程序来删除嵌入文件。我可以知道怎么办吗?真的很感谢!
public void addAttachments(String src, String dest, String[] attachments) throws IOException,DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
for (int i = 0; i < attachments.length; i++) {
addAttachment(stamper.getWriter(), new File(attachments[i]));
}
stamper.close();
}
protected void addAttachment(PdfWriter writer, File src) throws IOException {
PdfFileSpecification fs =
PdfFileSpecification.fileEmbedded(writer, src.getAbsolutePath(), src.getName(), null);
writer.addFileAttachment(src.getName().substring(0, src.getName().indexOf('.')), fs);
}
答案 0 :(得分:1)
首先让我重写代码以添加嵌入文件。
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();
}
您可以在此处找到完整的代码示例:AddEmbeddedFile
现在,当我们查看生成的PDF的“附件”面板时,我们会看到一个附件test.txt,其中包含描述&#34;一些测试文件&#34;:
添加此文件后,您现在要删除它。要做到这一点,请使用RUPS并查看内部:
这为我们提供了在何处查找嵌入文件的提示。看一下RemoveEmbeddedFile示例的代码,看看我们如何浏览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
和EmbeddedFiles
走到Names
数组。我知道我要删除的嵌入文件是数组中的第一个,我通过删除索引为0的元素两次删除名称和值。这首先删除描述,然后删除对文件的引用。附件现已消失:
由于我的示例中只有一个嵌入文件,所以当我查看PDF时,我现在看到一个空数组:
如果要一次删除所有嵌入文件,代码就更容易了。这显示在RemoveEmbeddedFiles示例中:
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
词典中不再有这样的条目: