From commits-return-14046-archive-asf-public=cust-asf.ponee.io@pdfbox.apache.org Sat Jan 5 14:16:44 2019 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 20382180645 for ; Sat, 5 Jan 2019 14:16:43 +0100 (CET) Received: (qmail 73432 invoked by uid 500); 5 Jan 2019 13:16:43 -0000 Mailing-List: contact commits-help@pdfbox.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@pdfbox.apache.org Delivered-To: mailing list commits@pdfbox.apache.org Received: (qmail 73423 invoked by uid 99); 5 Jan 2019 13:16:43 -0000 Received: from Unknown (HELO svn01-us-west.apache.org) (209.188.14.144) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 05 Jan 2019 13:16:43 +0000 Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id A7F533A0F6C for ; Sat, 5 Jan 2019 13:16:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1850487 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/multipdf/ main/java/org/apache/pdfbox/pdmodel/ main/java/org/apache/pdfbox/pdmodel/graphics/form/ main/java/org/apache/pdfbox/pdmodel/graphics/image/ main/java/org/apache/p... Date: Sat, 05 Jan 2019 13:16:42 -0000 To: commits@pdfbox.apache.org From: tilman@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20190105131642.A7F533A0F6C@svn01-us-west.apache.org> Author: tilman Date: Sat Jan 5 13:16:42 2019 New Revision: 1850487 URL: http://svn.apache.org/viewvc?rev=1850487&view=rev Log: PDFBOX-4423: getStructParent() and getStructParents() must return -1 when not available; consider this when merging and when testing merge; add previously failing test with file that has annotation but no /StructParent Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java?rev=1850487&r1=1850486&r2=1850487&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java Sat Jan 5 13:16:42 2019 @@ -1306,12 +1306,18 @@ public class PDFMergerUtility */ private void updateStructParentEntries(PDPage page, int structParentOffset) throws IOException { - page.setStructParents(page.getStructParents() + structParentOffset); + if (page.getStructParents() >= 0) + { + page.setStructParents(page.getStructParents() + structParentOffset); + } List annots = page.getAnnotations(); List newannots = new ArrayList<>(); for (PDAnnotation annot : annots) { - annot.setStructParent(annot.getStructParent() + structParentOffset); + if (annot.getStructParent() >= 0) + { + annot.setStructParent(annot.getStructParent() + structParentOffset); + } newannots.add(annot); } page.setAnnotations(newannots); Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java?rev=1850487&r1=1850486&r2=1850487&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java Sat Jan 5 13:16:42 2019 @@ -234,11 +234,12 @@ public class PDPage implements COSObject /** * This will get the key of this Page in the structural parent tree. * - * @return the integer key of the page's entry in the structural parent tree + * @return the integer key of the page's entry in the structural parent tree or -1 if + * there isn't any. */ public int getStructParents() { - return page.getInt(COSName.STRUCT_PARENTS, 0); + return page.getInt(COSName.STRUCT_PARENTS); } /** Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java?rev=1850487&r1=1850486&r2=1850487&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java Sat Jan 5 13:16:42 2019 @@ -239,14 +239,15 @@ public class PDFormXObject extends PDXOb } /** - * This will get the key of this XObjectForm in the structural parent tree. - * Required if the form XObject contains marked-content sequences that are - * structural content items. - * @return the integer key of the XObjectForm's entry in the structural parent tree + * This will get the key of this XObjectForm in the structural parent tree. Required if the form + * XObject contains marked-content sequences that are structural content items. + * + * @return the integer key of the XObjectForm's entry in the structural parent tree or -1 if + * there isn't any. */ public int getStructParents() { - return getCOSObject().getInt(COSName.STRUCT_PARENTS, 0); + return getCOSObject().getInt(COSName.STRUCT_PARENTS); } /** Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1850487&r1=1850486&r2=1850487&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Sat Jan 5 13:16:42 2019 @@ -374,11 +374,12 @@ public final class PDImageXObject extend /** * Returns the key of this XObject in the structural parent tree. - * @return this object's key the structural parent tree + * + * @return this object's key the structural parent tree or -1 if there isn't any. */ public int getStructParent() { - return getCOSObject().getInt(COSName.STRUCT_PARENT, 0); + return getCOSObject().getInt(COSName.STRUCT_PARENT); } /** Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java?rev=1850487&r1=1850486&r2=1850487&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java Sat Jan 5 13:16:42 2019 @@ -636,12 +636,13 @@ public abstract class PDAnnotation imple /** * This will get the key of this annotation in the structural parent tree. - * - * @return the integer key of the annotation's entry in the structural parent tree + * + * @return the integer key of the annotation's entry in the structural parent tree or -1 if + * there isn't any. */ public int getStructParent() { - return getCOSObject().getInt(COSName.STRUCT_PARENT, 0); + return getCOSObject().getInt(COSName.STRUCT_PARENT); } /** Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java?rev=1850487&r1=1850486&r2=1850487&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/PDFMergerUtilityTest.java Sat Jan 5 13:16:42 2019 @@ -378,6 +378,47 @@ public class PDFMergerUtilityTest extend } /** + * PDFBOX-4423: test merging a PDF where a widget has no StructParent. + * + * @throws IOException + */ + public void testStructureTreeMerge7() throws IOException + { + PDFMergerUtility pdfMergerUtility = new PDFMergerUtility(); + PDDocument src = PDDocument.load(new File(TARGETPDFDIR, "PDFBOX-4423-000746.pdf")); + + PDStructureTreeRoot structureTreeRoot = src.getDocumentCatalog().getStructureTreeRoot(); + PDNumberTreeNode parentTree = structureTreeRoot.getParentTree(); + Map numberTreeAsMap = PDFMergerUtility.getNumberTreeAsMap(parentTree); + assertEquals(33, numberTreeAsMap.size()); + assertEquals(64, Collections.max(numberTreeAsMap.keySet()) + 1); + assertEquals(31, (int) Collections.min(numberTreeAsMap.keySet())); + assertEquals(126, structureTreeRoot.getParentTreeNextKey()); + + PDDocument dst = new PDDocument(); + + pdfMergerUtility.appendDocument(dst, src); + src.close(); + dst.save(new File(TARGETTESTDIR, "PDFBOX-4423-merged.pdf")); + dst.close(); + + dst = PDDocument.load(new File(TARGETTESTDIR, "PDFBOX-4423-merged.pdf")); + checkWithNumberTree(dst); + checkForPageOrphans(dst); + + structureTreeRoot = dst.getDocumentCatalog().getStructureTreeRoot(); + parentTree = structureTreeRoot.getParentTree(); + numberTreeAsMap = PDFMergerUtility.getNumberTreeAsMap(parentTree); + assertEquals(33, numberTreeAsMap.size()); + assertEquals(64, Collections.max(numberTreeAsMap.keySet()) + 1); + assertEquals(31, (int) Collections.min(numberTreeAsMap.keySet())); + assertEquals(64, structureTreeRoot.getParentTreeNextKey()); + dst.close(); + + checkStructTreeRootCount(new File(TARGETTESTDIR, "PDFBOX-4423-merged.pdf")); + } + + /** * PDFBOX-4009: Test that ParentTreeNextKey is recalculated correctly. */ public void testMissingParentTreeNextKey() throws IOException @@ -508,13 +549,21 @@ public class PDFMergerUtilityTest extend { for (PDAnnotationWidget widget : field.getWidgets()) { - assertTrue(keySet.contains(widget.getStructParent())); + if (widget.getStructParent() >= 0) + { + assertTrue("field '" + field.getFullyQualifiedName() + "' /StructParent " + + widget.getStructParent() + " missing in /ParentTree", + keySet.contains(widget.getStructParent())); + } } } } for (PDPage page : document.getPages()) { - assertTrue(keySet.contains(page.getStructParents())); + if (page.getStructParents() >= 0) + { + assertTrue(keySet.contains(page.getStructParents())); + } } // might also test image and form dictionaries...