【问题标题】:Java PDFBox: Remove the parent element in tagged PDFJava PDFBox:删除标记PDF中的父元素
【发布时间】:2021-09-03 06:26:09
【问题描述】:

我在 PAC3 验证中收到可能不恰当地使用“表格”结构元素警告。 PDF中的表结构如下,

为了传递 PAC3,我现在将表格从父标签拖到一个元素中,如下所示,

我尝试了下面的代码,但没有成功

PDStructureElement parent=(PDStructureElement)element.getParent();

//parent.setStructureType(StandardStructureTypes.TABLE);
element.insertBefore(element,parent);
element.setParent(parent.getParent());

请帮帮我。

【问题讨论】:

  • 你能分享一个示例 pdf 作为测试文件吗?
  • 先问一个问题,你确定你试图操纵正确的元素吗?乍一看,PAC3 抱怨 Inline_Table 元素内的 Table 元素,而不是 Footnote_Inline_Tabl 元素内的屏幕截图。此外,标签结构中似乎还存在 PAC3 未报告的其他问题。
  • 也就是说,当您想将element 插入祖父母的孩子中时,您应该尝试使用parent.getParent().insertBefore 而不是element.insertBefore

标签: java pdf pdfbox tagged-pdf


【解决方案1】:

您显示的代码中的主要问题是您尝试将 element 作为自己的孩子插入,而不是作为其当前祖父母的孩子:

element.insertBefore(element,parent);

你可以让它像这样工作:

if (element instanceof PDStructureElement) {
    PDStructureElement pdStructureElement = (PDStructureElement) element;
    if ("Table".equals(pdStructureElement.getStructureType())) {
        PDStructureNode parentNode = pdStructureElement.getParent();
        if (parentNode instanceof PDStructureElement) {
            PDStructureElement parent = (PDStructureElement) parentNode;
            PDStructureNode newParentNode = parent.getParent();
            if (newParentNode != null) {
                newParentNode.insertBefore(pdStructureElement, parent);
                pdStructureElement.setParent(newParentNode);
                newParentNode.removeKid(parent);
            }
        }
    }
}

(来自MoveInStructureTree 辅助方法checkAndMoveTableUp

将此递归应用到 PDF 的结构树会删除 在 PAC3 验证中可能不恰当地使用“表格”结构元素警告,参见。 MoveInStructureTree 测试testMoveTableUpTradeSimple1

(此代码假设像在您的示例文档中一样,所有 Table 元素都作为单个孩子嵌入到要替换的父元素中。对于其他情况,您必须添加一些健全性检查,并且可能对其他情况进行特殊处理。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2018-01-17
    • 2013-01-17
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多