Java PDFBox:删除标记 PDF 中的父元素

Java PDFBox: Remove the parent element in tagged PDF

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

为了通过 PAC3,我现在将表从父标签拖到一个单独的元素中,如下所示,

我试过下面的代码,但是没有用

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

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

请帮我解决这个问题。

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

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 验证中的 可能不恰当地使用“Table”结构元素 警告,比照。 MoveInStructureTree 测试 testMoveTableUpTradeSimple1.

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