如何使用itext删除PDF附件

2023-11-29

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

让我首先重写您的代码以添加嵌入文件。

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

添加此文件后,您现在想要将其删除。为此,请使用 RUPS 并查看内部:

enter image description here

这给了我们在哪里找到嵌入文件的提示。看一下代码删除嵌入文件示例来了解我们如何浏览 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

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

enter image description here

如果您想一次删除所有嵌入的文件,代码就更简单了。这显示在删除嵌入文件例子:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用itext删除PDF附件 的相关文章

随机推荐