Search in sources :

Example 1 with PDStructureElement

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
}
Also used : PDStructureElementNameTreeNode(com.tom_roush.pdfbox.pdmodel.PDStructureElementNameTreeNode) COSDictionary(com.tom_roush.pdfbox.cos.COSDictionary) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) PDStructureElement(com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement)

Example 2 with PDStructureElement

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"));
}
Also used : PDDocument(com.tom_roush.pdfbox.pdmodel.PDDocument) File(java.io.File) PDStructureElement(com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement) Test(org.junit.Test)

Example 3 with PDStructureElement

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;
}
Also used : COSDictionary(com.tom_roush.pdfbox.cos.COSDictionary) PDStructureElement(com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement)

Example 4 with PDStructureElement

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));
        }
    }
}
Also used : PDStructureElement(com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement)

Aggregations

PDStructureElement (com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement)4 COSDictionary (com.tom_roush.pdfbox.cos.COSDictionary)2 PDDocument (com.tom_roush.pdfbox.pdmodel.PDDocument)1 PDStructureElementNameTreeNode (com.tom_roush.pdfbox.pdmodel.PDStructureElementNameTreeNode)1 File (java.io.File)1 HashMap (java.util.HashMap)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 Test (org.junit.Test)1