当前位置: 首页 > 知识库问答 >
问题:

PdfBox展平pdf不会删除acroform元素

芮宇航
2023-03-14

我有一个带有很多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。

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

因为我可以看到问题只发生在复选框,正常的文本字段将被正确删除

共有1个答案

颜瀚漠
2023-03-14

如评论中所述:

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

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

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

目前在Apacha Jira条目PDFBOX-4066的上下文中讨论并解决了此错误。

 类似资料:
  • 如何使用PDFBox“展平”PDF表单(删除表单字段,但保留字段文本)? 这里回答了同样的问题: 一个快速的方法是从acrofrom中删除字段。 为此,您只需要获取文档曲库,然后是acroform,然后从该acroform中删除所有字段。 图形表示与注释链接并保留在文档中。 所以我写了这段代码:

  • 我正在使用ApachePDFBOx2.0.8并试图删除一个字段。但是找不到这样做的方法,就像我可以用iText:。 我要做的事情。最初,我有3个数字签名的模板PDF。在某些情况下,我只需要2个签名,所以在这种情况下,我需要从模板中删除第三个签名。看起来我不能用PDFBox做这件事,我发现的是扁平化这个字段,但问题是如果一个扁平化的特定PDField(不是整个表单,而是一个字段)-所有其他签名都失去

  • 链接到pdf 当我尝试从上面的pdf中提取文本时,我得到了在evince viewer中不可见的文本和可见的文本的混合。此外,一些所需的文本缺少查看器中没有缺少的字符,例如,“FALCONS”中的“S”和许多缺少的“½”字符。我认为这是由于不可见文本的干扰,因为在查看器中突出显示pdf时,可以看到不可见文本与可见文本重叠。 有没有办法去掉不可见的文字?还是有别的解决办法? 代码: 输出(粗体文本为

  • 问题内容: 链接到pdf 当我尝试从上面的pdf中提取文本时,我混合了在evince查看器中不可见的文本和可见的文本。此外,某些所需的文本缺少查看器中未缺少的字符,例如“ FALCONS”中的“ S”和许多缺少的“ 1/2”字符。我认为这是由于来自不可见文本的干扰,因为在查看器中突出显示pdf时,可以看到不可见文本与可见文本重叠。 有没有办法删除不可见的文字?还是有其他解决方案? 码: 输出(粗体

  • 我正在尝试用Java中的PDFBox编辑pdf的一些内容。问题是,每当我编辑pdf中的任何字符串,并尝试使用Adobe Reader打开它时,最后一行不会出现在新呈现的pdf中。 当我尝试直接从浏览器顶部打开渲染的pdf时,我能够看到最后一行。但是,它以不同的格式编码。我正在使用以下代码编辑pdf的内容: 编辑pdf会删除“有问题?...”这一行。这里有什么问题?我做错了什么吗? 谢谢。

  • 我需要比较PDF文档,这些文档是用iText创建的。我实际上设法比较了文件,但我发现了一个微小的差异。 当在像Notepad++这样的编辑器中打开PDF文件时,我可以看到文件末尾有这样的东西: