PdfBox flatten pdf不会删除acroform元素

时间:2018-01-15 23:05:56

标签: java pdfbox

我有一个带有大量acroforms的pdf,我对它做了一些操作,这导致了一个新的pdf。 所以我有PDF-1(这是原始的)和PDF-2(只是PDF-1的重复),现在我想合并它们。两个PDF都有一些acroforms例如:field_a,field_2 ...

在合并之前,我将PDF-1弄平,因为我只想从PDF-2获得acrofields。当我检查我的新合并PDF时,我可以看到PDF-1页面上没有可见字段,PDF-2字段页面上有字段。初看起来似乎没问题,但是当我检查字段时,我可以看到合并已重命名为PDF-2的所有字段,例如field_a_dummy123,field_b_dummy232 ...

在我看来,展平不会删除字段,这就是为什么PDFBox的PDFMerger会重命名PDF-2的字段,因为acrofield需要是唯一的。有没有办法完全删除PDF-1的acroforms?

@Test
public void flattenAndMerge() throws IOException {
    File testForm = new File(classLoader.getResource("./TestForm.pdf").getFile());

    byte[] testFormAsByte = Files.readAllBytes(testForm.toPath());
    byte[] testFormAsByte2 = Files.readAllBytes(testForm.toPath());

    PDDocument pdf1 = PDDocument.load(testFormAsByte);
    PDAcroForm acroform = pdf1.getDocumentCatalog().getAcroForm();
    acroform.flatten();
    Path flattendedPdf = Files.createTempFile("flatten", ".pdf");
    pdf1.save(flattendedPdf.toFile());


    PDFMergerUtility merger = new PDFMergerUtility();
    merger.addSource(new ByteArrayInputStream(Files.readAllBytes(flattendedPdf)));
    merger.addSource(new ByteArrayInputStream(testFormAsByte2));
    merger.setDestinationFileName("./build/flattenAndMerge.pdf");
    merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());

}

我正在使用PDFBox 2.0.8。

这是输入文件:https://ufile.io/6etxp 以下是测试结果:https://ufile.io/bh94n

正如我所看到的,只有复选框才会出现问题,正常的文本字段将被正确删除

1 个答案:

答案 0 :(得分:1)

正如评论中已经提到的那样:

确实,这是一个错误。但是,由于OP已假设平展不会删除字段,因此PDFMergerUtility.mergeAcroForm中的合并代码存在问题。

根本问题在于处理非平凡的字段层次结构:在OP共享的示例源文档中,复选框字段不是顶级字段,但它们位于顶级节点" cb_a&# 34。

在合并文档中,它们不仅被重命名,而且还被添加到顶级表单字段列表中;这实际上是无效的,因为他们仍然有一个父参考" cb_a"。

目前在Apacha Jira条目PDFBOX-4066的背景下讨论和解决了这个错误。