Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PdfBox展平pdf不会删除acroform元素_Java_Pdfbox - Fatal编程技术网

Java PdfBox展平pdf不会删除acroform元素

Java PdfBox展平pdf不会删除acroform元素,java,pdfbox,Java,Pdfbox,我有一个带有很多acroforms的pdf,我对它进行了一些操作,结果得到了一个新的pdf。 所以我有PDF-1(这是原始版本)和PDF-2(只是PDF-1的副本),现在我想合并它们。两个PDF都有一些缩略形式,例如:字段a、字段2 在合并它们之前,我会将PDF-1展平,因为我只想从PDF-2中获取acrofields。当我检查新合并的PDF时,我可以看到PDF-1页面上没有可见字段,PDF-2页面上有字段。乍一看似乎还可以,但当我检查字段时,我可以看到合并已重命名PDF-2的所有字段,例如fi

我有一个带有很多acroforms的pdf,我对它进行了一些操作,结果得到了一个新的pdf。 所以我有PDF-1(这是原始版本)和PDF-2(只是PDF-1的副本),现在我想合并它们。两个PDF都有一些缩略形式,例如:字段a、字段2

在合并它们之前,我会将PDF-1展平,因为我只想从PDF-2中获取acrofields。当我检查新合并的PDF时,我可以看到PDF-1页面上没有可见字段,PDF-2页面上有字段。乍一看似乎还可以,但当我检查字段时,我可以看到合并已重命名PDF-2的所有字段,例如field_a_dummy123、field_b_dummy232

在我看来,展平并不会删除字段,这就是为什么PDFBox中的PDFMerger会将字段重命名为PDF-2,因为字段必须是唯一的。有没有办法完全删除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());

}
我正在使用PDFBOX2.0.8

这是输入文件: 以下是测试结果:


正如我所看到的,问题只出现在复选框中,普通文本字段将被正确删除,正如注释中所述:

事实上,这是一个bug。但事实并非如此,因为OP假设展平不会删除字段,这是
PDFMergerUtility.mergeAcroForm
中合并代码的问题

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

在合并文档中,它们不仅被重命名,而且还被添加到顶级表单字段列表中;这实际上是无效的,因为它们仍然有对“cb_a”的父引用


此错误目前在Apacha Jira条目的上下文中讨论和解决。

您使用的是什么版本?请共享PDF文件。我已经编辑了我的帖子并添加了信息。确实,有一个bug,我认为这是由于处理非平凡字段层次结构的问题造成的:复选框字段不是顶级字段,但它们位于顶级节点“cb_a”下。在合并中,它们不仅被重命名,而且还被添加到顶级表单字段列表中;这实际上是无效的,因为它们仍然有对“cb_a”的父引用。您可能希望首先尝试使用具有普通表单层次结构的PDF,而PDFBox有一个问题需要解决…;)可能是
mergeAcroForm()
中的错误。请在中打开一个问题,并将您的文件附加到那里。在组件中,选择Acroform+实用程序。好的,在那里添加了错误: