use of com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement in project PdfBox-Android by TomRoush.
the class PDFMergerUtility method mergeIDTree.
private void mergeIDTree(PDFCloneUtility cloner, PDStructureTreeRoot srcStructTree, PDStructureTreeRoot destStructTree) throws IOException {
PDNameTreeNode<PDStructureElement> srcIDTree = srcStructTree.getIDTree();
PDNameTreeNode<PDStructureElement> destIDTree = destStructTree.getIDTree();
if (srcIDTree == null) {
return;
}
if (destIDTree == null) {
destIDTree = new PDStructureElementNameTreeNode();
}
Map<String, PDStructureElement> srcNames = getIDTreeAsMap(srcIDTree);
Map<String, PDStructureElement> destNames = getIDTreeAsMap(destIDTree);
for (Map.Entry<String, PDStructureElement> entry : srcNames.entrySet()) {
if (destNames.containsKey(entry.getKey())) {
Log.w("PdfBox-Android", "key " + entry.getKey() + " already exists in destination IDTree");
} else {
destNames.put(entry.getKey(), new PDStructureElement((COSDictionary) cloner.cloneForNewDocument(entry.getValue().getCOSObject())));
}
}
destIDTree = new PDStructureElementNameTreeNode();
destIDTree.setNames(destNames);
destStructTree.setIDTree(destIDTree);
// Note that all elements are stored flatly. This could become a problem for large files
// when these are opened in a viewer that uses the tagging information.
// If this happens, then PDNameTreeNode should be improved with a convenience method that
// stores the map into a B+Tree, see https://en.wikipedia.org/wiki/B+_tree
}
use of com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement in project PdfBox-Android by TomRoush.
the class PDFMergerUtilityTest method testStructureTreeMergeIDTree.
/**
* PDFBOX-4416: Test merging of /IDTree
* <br>
* PDFBOX-4009: test merging to empty destination
*
* @throws IOException
*/
@Test
public void testStructureTreeMergeIDTree() throws IOException {
PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
PDDocument src = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-4417-001031.pdf"));
PDDocument dst = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-4417-054080.pdf"));
PDNameTreeNode<PDStructureElement> srcIDTree = src.getDocumentCatalog().getStructureTreeRoot().getIDTree();
Map<String, PDStructureElement> srcIDTreeMap = PDFMergerUtility.getIDTreeAsMap(srcIDTree);
PDNameTreeNode<PDStructureElement> dstIDTree = dst.getDocumentCatalog().getStructureTreeRoot().getIDTree();
Map<String, PDStructureElement> dstIDTreeMap = PDFMergerUtility.getIDTreeAsMap(dstIDTree);
int expectedTotal = srcIDTreeMap.size() + dstIDTreeMap.size();
assertEquals(192, expectedTotal);
// PDFBOX-4009, test that empty dest doc still merges structure tree
// (empty dest doc is used in command line app)
PDDocument emptyDest = new PDDocument();
pdfMergerUtility.appendDocument(emptyDest, src);
src.close();
src = emptyDest;
assertEquals(4, src.getDocumentCatalog().getStructureTreeRoot().getParentTreeNextKey());
pdfMergerUtility.appendDocument(dst, src);
src.close();
dst.save(new File(TARGETTESTDIR, "PDFBOX-4416-IDTree-merged.pdf"));
dst.close();
dst = PDDocument.load(new File(TARGETTESTDIR, "PDFBOX-4416-IDTree-merged.pdf"));
checkWithNumberTree(dst);
checkForPageOrphans(dst);
dstIDTree = dst.getDocumentCatalog().getStructureTreeRoot().getIDTree();
dstIDTreeMap = PDFMergerUtility.getIDTreeAsMap(dstIDTree);
assertEquals(expectedTotal, dstIDTreeMap.size());
dst.close();
checkStructTreeRootCount(new File(TARGETTESTDIR, "PDFBOX-4416-IDTree-merged.pdf"));
}
use of com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement in project PdfBox-Android by TomRoush.
the class PDOutlineItem method getStructureElement.
/**
* Get the structure element of this node.
*
* @return The structure element of this node.
*/
public PDStructureElement getStructureElement() {
PDStructureElement se = null;
COSDictionary dic = (COSDictionary) getCOSObject().getDictionaryObject(COSName.SE);
if (dic != null) {
se = new PDStructureElement(dic);
}
return se;
}
use of com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement in project PdfBox-Android by TomRoush.
the class PDFMergerUtilityTest method checkForIDTreeOrphans.
private void checkForIDTreeOrphans(PDPageTree pageTree, PDStructureTreeRoot structureTreeRoot) throws IOException {
PDNameTreeNode<PDStructureElement> idTree = structureTreeRoot.getIDTree();
if (idTree == null) {
return;
}
Map<String, PDStructureElement> map = PDFMergerUtility.getIDTreeAsMap(idTree);
for (PDStructureElement element : map.values()) {
if (element.getPage() != null) {
checkForPage(pageTree, element);
}
if (!element.getKids().isEmpty()) {
checkElement(pageTree, element.getCOSObject().getDictionaryObject(COSName.K));
}
}
}
Aggregations