The main issue in the code you show is that you try to insert the element
as kid of itself instead of as kid of its current grand parent:
element.insertBefore(element,parent);
You can make it work like this:
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);
}
}
}
}
(from MoveInStructureTree helper method checkAndMoveTableUp
)
Applying this recursively to the structure tree of your PDF removes the Possibly inappropriate use of a "Table" structure element warning in PAC3 validation, cf. the MoveInStructureTree test testMoveTableUpTradeSimple1
.
(This code assumes that like in your example document all Table elements are embedded as single kid in a parent element to replace. For other cases you have to add some sanity checks and probably special treatment of other cases.)