如何使用itext删除PDF的附件

时间:2014-10-30 08:44:25

标签: java itext

我是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);
                                }

1 个答案:

答案 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;:

enter image description here

添加此文件后,您现在要删除它。要做到这一点,请使用RUPS并查看内部:

enter image description here

这为我们提供了在何处查找嵌入文件的提示。看一下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();
}

如您所见,我们从文档的根目录(也就是目录)开始,然后我们通过NamesEmbeddedFiles走到Names数组。我知道我要删除的嵌入文件是数组中的第一个,我通过删除索引为0的元素两次删除名称和值。这首先删除描述,然后删除对文件的引用。附件现已消失:

enter image description here

由于我的示例中只有一个嵌入文件,所以当我查看PDF时,我现在看到一个空数组:

enter image description here

如果要一次删除所有嵌入文件,代码就更容易了。这显示在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词典中不再有这样的条目:

enter image description here