Add merge tagged pdf tests from Thanasis Giannimaras

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1717644 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index d0d5dcd..808a52b 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -115,6 +115,7 @@
     private static final String SHADING = "test/resources/shading.pdf";
     private static final String LINK = "test/resources/link.pdf";
     private static final String IMAGE = "test/resources/image.pdf";
+    private static final String HELLOTagged = "test/resources/taggedWorld.pdf";
 
     private PDFBoxAdapter getPDFBoxAdapter() {
         PDFDocument doc = new PDFDocument("");
@@ -324,6 +325,20 @@
     }
 
     @Test
+    public void testTaggedPDFWriter() throws IOException {
+        PDFDocument pdfdoc = new PDFDocument("");
+        PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+        pdfpage.setDocument(pdfdoc);
+        PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
+        adapter.setCurrentMCID(5);
+        PDDocument doc = PDDocument.load(HELLOTagged);
+        PDPage page = (PDPage) doc.getDocumentCatalog().getAllPages().get(0);
+        AffineTransform at = new AffineTransform();
+        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+        String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+        Assert.assertTrue(stream, stream.contains("/P <</MCID 5 >>BDC"));
+        doc.close();
+    }
     public void testLink() throws Exception {
         PDFDocument pdfdoc = new PDFDocument("");
         PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
diff --git a/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java b/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
index a73edc3..6fb34b2 100644
--- a/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
@@ -18,15 +18,20 @@
 package org.apache.fop.render.pdf;
 
 import java.io.IOException;
+import java.util.HashMap;
 
 import org.junit.Test;
 
 import org.apache.pdfbox.cos.COSArray;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSInteger;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSObject;
+
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.graphics.PDXObject;
 
 import org.apache.fop.render.pdf.pdfbox.PageParentTreeFinder;
 
@@ -59,4 +64,17 @@
         expected = 1;
         Assert.assertEquals(test, expected);
     }
+
+    @Test
+    public void testNoparentTreePresent() {
+        PDPage srcPage = new PDPage();
+        srcPage.getCOSDictionary().setItem(COSName.STRUCT_PARENTS, COSInteger.get(-1));
+        PDResources res = new PDResources();
+        res.setXObjects(new HashMap<String, PDXObject>());
+        srcPage.setResources(res);
+        PageParentTreeFinder finder = new PageParentTreeFinder(srcPage);
+        COSArray parentTree = finder.getPageParentTreeArray(null);
+        int test = parentTree.size();
+        Assert.assertEquals(test, 0);
+    }
 }
diff --git a/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java b/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
index 1aae1d1..f16325c 100644
--- a/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
@@ -23,8 +23,6 @@
 import java.util.HashMap;
 import java.util.List;
 
-
-
 import org.junit.Test;
 
 import org.apache.pdfbox.cos.COSArray;
@@ -33,7 +31,6 @@
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSObject;
 
-
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 
@@ -42,6 +39,7 @@
 import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFName;
 import org.apache.fop.pdf.PDFNumber;
+import org.apache.fop.pdf.PDFObject;
 import org.apache.fop.pdf.PDFPage;
 import org.apache.fop.pdf.PDFReference;
 import org.apache.fop.pdf.PDFResources;
@@ -55,8 +53,8 @@
 
 public class StructureTreeMergerTestCase {
     private static final String LINK = "test/resources/linkTagged.pdf";
-    private static final String NoParentTree = "test/resources/NoParentTree.pdf";
     private static final String BrokenLink = "test/resources/brokenLink.pdf";
+    private static final String MissingOBJR = "test/resources/missingOBJR.pdf";
     private PDFPage pdfPage;
     private PDFDocument pdfDoc;
     private PDFBoxAdapter adapter;
@@ -71,6 +69,7 @@
         PDFStructElem elem = new PDFStructElem();
         elem.setObjectNumber(2);
         adapter = new PDFBoxAdapter(pdfPage, new HashMap(), new HashMap<Integer, PDFArray>());
+        adapter.setCurrentMCID(1);
         PDFLogicalStructureHandler handler = setUpPDFLogicalStructureHandler();
         StructureTreeMerger merger = new StructureTreeMerger(elem, handler, adapter, srcPage);
         merger.copyStructure(markedContentParents);
@@ -81,82 +80,6 @@
     }
 
     @Test
-    public void testCreateDirectDescendants() throws IOException {
-        setUp();
-        PDDocument doc = PDDocument.load(NoParentTree);
-        PDPage srcPage = doc.getPage(0);
-        PDFStructElem elem = new PDFStructElem();
-        elem.setObjectNumber(2);
-        adapter = new PDFBoxAdapter(pdfPage, new HashMap(), new HashMap<Integer, PDFArray>());
-        PDFLogicalStructureHandler handler = setUpPDFLogicalStructureHandler();
-        StructureTreeMerger merger = new StructureTreeMerger(elem, handler, adapter, srcPage);
-        COSDictionary strucRootDict = (COSDictionary)doc.getDocumentCatalog().getStructureTreeRoot()
-            .getCOSObject();
-        merger.createDirectDescendants(strucRootDict, elem);
-        checkNoParentTree(elem, 0);
-    }
-
-    private void checkMarkedContentsParentsForLinkTest(PDFArray array) {
-        PDFStructElem first = (PDFStructElem)array.get(0);
-        List firstKids = first.getKids();
-        PDFDictionary firstKid = (PDFDictionary) firstKids.get(0);
-        int test = ((PDFNumber)firstKid.get("MCID")).getNumber().intValue();
-        int expected = 0;
-        Assert.assertEquals(test, expected);
-        PDFDictionary firstKidSibling = (PDFDictionary) firstKids.get(2);
-        test = ((PDFNumber)firstKidSibling.get("MCID")).getNumber().intValue();
-        expected = 2;
-        Assert.assertEquals(test, expected);
-        PDFStructElem second = (PDFStructElem)array.get(1);
-        List secondKids = second.getKids();
-        PDFDictionary secKid = (PDFDictionary) secondKids.get(0);
-        test = ((PDFNumber)secKid.get("MCID")).getNumber().intValue();
-        expected = 1;
-        Assert.assertEquals(test, expected);
-    }
-
-    private void checkParentForLinkTest(PDFStructElem elem, int index) {
-        String [] types = {"Sect", "Part"};
-        PDFStructElem parent = (PDFStructElem)((PDFReference)elem.get("P")).getObject();
-        if (index != 2) {
-            String test = ((PDFName)parent.get("S")).getName();
-            String expected = types[index];
-            Assert.assertEquals(test, expected);
-            index++;
-            checkParentForLinkTest(parent, index);
-        }
-    }
-
-    private void setUp() {
-        Rectangle2D r = new Rectangle2D.Double();
-        pdfPage = new PDFPage(new PDFResources(pdfDoc), 0, r, r, r, r);
-        pdfDoc = new PDFDocument(" ");
-        pdfDoc.makeStructTreeRoot(null);
-        pdfPage.setObjectNumber(1);
-        pdfPage.setDocument(pdfDoc);
-    }
-
-    private PDFLogicalStructureHandler setUpPDFLogicalStructureHandler() {
-        PDFLogicalStructureHandler handler = new PDFLogicalStructureHandler(pdfDoc);
-        handler.getParentTree().setDocument(pdfDoc);
-        handler.startPage(pdfPage);
-        return handler;
-    }
-
-    private void checkNoParentTree(PDFStructElem elem, int index) {
-        String [] types = {"Document", "Part"};
-        if (index != 2) {
-            PDFStructElem kid = (PDFStructElem)elem.getKids().get(0);
-            String test = ((PDFName)kid.get("S")).getName();
-            String expected = types[index];
-            Assert.assertEquals(test, expected);
-            index++;
-            checkNoParentTree(kid, index);
-        }
-    }
-
-
-    @Test
     public void testNullEntriesInParentTree() throws IOException {
         setUp();
         PDDocument doc = PDDocument.load(LINK);
@@ -173,8 +96,85 @@
         PDFArray array = handler.getPageParentTree();
         Assert.assertNull(array.get(0));
     }
+
     @Test
-    public void checkNullCOSObject() throws IOException {
+    public void testOBJRCorrectPosition() throws IOException {
+        setUp();
+        PDDocument doc = PDDocument.load(MissingOBJR);
+        PDPage srcPage = doc.getPage(0);
+        PageParentTreeFinder finder = new PageParentTreeFinder(srcPage);
+        COSArray markedContentParents = finder.getPageParentTreeArray(doc);
+        PDFStructElem elem = new PDFStructElem();
+        elem.setObjectNumber(2);
+        adapter = new PDFBoxAdapter(pdfPage, new HashMap(), new HashMap<Integer, PDFArray>());
+        PDFLogicalStructureHandler handler = setUpPDFLogicalStructureHandler();
+        StructureTreeMerger merger = new StructureTreeMerger(elem, handler, adapter, srcPage);
+        merger.copyStructure(markedContentParents);
+//        PDFArray array = handler.getPageParentTree();
+
+//        PDFStructElem kid = (PDFStructElem)array.get(0);
+//        PDFReference reference = (PDFReference) kid.get("P");
+//        PDFStructElem parent = (PDFStructElem)reference.getObject();
+//        List<PDFObject> kids = parent.getKids();
+//        PDFDictionary first = (PDFDictionary) kids.get(0);
+
+//        Assert.assertEquals(first.get("Type").toString(), "/OBJR");
+//        PDFDictionary last = (PDFDictionary) kids.get(2);
+//        Assert.assertEquals(last.get("Type").toString(), "/OBJR");
+
+//        PDFStructElem middle = (PDFStructElem) kids.get(1);
+//        Assert.assertEquals(middle.get("Type").toString(), "/StructElem");
+    }
+
+    private void checkMarkedContentsParentsForLinkTest(PDFArray array) {
+        PDFStructElem first = (PDFStructElem)array.get(0);
+        List firstKids = first.getKids();
+        PDFDictionary firstKid = (PDFDictionary) firstKids.get(0);
+        int test = ((PDFNumber)firstKid.get("MCID")).getNumber().intValue();
+        int expected = 1;
+        Assert.assertEquals(test, expected);
+        PDFDictionary firstKidSibling = (PDFDictionary) firstKids.get(2);
+        test = ((PDFNumber)firstKidSibling.get("MCID")).getNumber().intValue();
+        expected = 3;
+        Assert.assertEquals(test, expected);
+        PDFStructElem second = (PDFStructElem)array.get(1);
+        List secondKids = second.getKids();
+        PDFDictionary secKid = (PDFDictionary) secondKids.get(0);
+        test = ((PDFNumber)secKid.get("MCID")).getNumber().intValue();
+        expected = 2;
+        Assert.assertEquals(test, expected);
+    }
+
+    private void checkParentForLinkTest(PDFStructElem elem, int index) {
+        String [] types = {"Sect", "Part"};
+        PDFStructElem parent = (PDFStructElem)((PDFReference)elem.get("P")).getObject();
+        if (index != 2) {
+            String test = ((PDFName)parent.get("S")).getName();
+            String expected = types[index];
+            Assert.assertEquals(test, expected);
+            index++;
+            checkParentForLinkTest(parent, index);
+        }
+    }
+
+    private void setUp() {
+        Rectangle2D r = new Rectangle2D.Double();
+        pdfDoc = new PDFDocument(" ");
+        pdfPage = new PDFPage(new PDFResources(pdfDoc), 0, r, r, r, r);
+        pdfDoc.makeStructTreeRoot(null);
+        pdfPage.setObjectNumber(1);
+        pdfPage.setDocument(pdfDoc);
+    }
+
+    private PDFLogicalStructureHandler setUpPDFLogicalStructureHandler() {
+        PDFLogicalStructureHandler handler = new PDFLogicalStructureHandler(pdfDoc);
+        handler.getParentTree().setDocument(pdfDoc);
+        handler.startPage(pdfPage);
+        return handler;
+    }
+
+    @Test
+    public void testCheckNullCOSObject() throws IOException {
         setUp();
         PDDocument doc = PDDocument.load(BrokenLink);
         PDPage srcPage = doc.getPage(0);
@@ -198,4 +198,28 @@
         PDFDictionary objrDict = (PDFDictionary) parentElem.getKids().get(1);
         Assert.assertNull(objrDict.get("Obj"));
     }
+
+    @Test
+    public void testDirectDescedants() throws IOException {
+        PDFStructElem elem = new PDFStructElem();
+        elem.setObjectNumber(100);
+        setUp();
+        adapter = new PDFBoxAdapter(pdfPage, new HashMap(), new HashMap<Integer, PDFArray>());
+        PDFLogicalStructureHandler handler = setUpPDFLogicalStructureHandler();
+        PDPage srcPage = new PDPage();
+        StructureTreeMerger merger = new StructureTreeMerger(elem, handler, adapter, srcPage);
+        COSArray array = new COSArray();
+        COSDictionary dict = new COSDictionary();
+        dict.setItem(COSName.S, COSName.P);
+        COSObject obj = new COSObject(dict);
+        obj.setObjectNumber(COSInteger.get(200));
+        obj.setGenerationNumber(COSInteger.ZERO);
+        array.add(0, obj);
+        merger.createDirectDescendants(array, elem);
+        List<PDFObject> list = elem.getKids();
+        PDFStructElem kid = (PDFStructElem)list.get(0);
+        PDFName name = (PDFName)kid.get("S");
+        String test = name.getName();
+        Assert.assertEquals(test, "P");
+    }
 }
diff --git a/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java b/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java
new file mode 100644
index 0000000..ea11639
--- /dev/null
+++ b/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.fop.render.pdf;
+
+import java.util.List;
+
+import org.junit.Test;
+
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+
+import org.apache.fop.render.pdf.pdfbox.StructureTreeMergerUtil;
+
+import junit.framework.Assert;
+
+public class StructureTreeMergerUtilTestCase {
+
+    @Test
+    public void testFindRoleMapKeyByValue() {
+
+        COSDictionary rolemap = new COSDictionary();
+        COSName key1 = COSName.getPDFName("Para");
+        COSName value1 = COSName.getPDFName("P");
+        COSName key2 = COSName.getPDFName("Icon");
+        COSName value2 = COSName.getPDFName("Image");
+        rolemap.setItem(key1, value1);
+        rolemap.setItem(key2, value2);
+        String type = "Image";
+        List<String> result = StructureTreeMergerUtil.findRoleMapKeyByValue(type, rolemap);
+        String test = result.get(0);
+        String expected = "Icon";
+        Assert.assertEquals(test, expected);
+    }
+}
diff --git a/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java b/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java
index e058a69..0b815db 100644
--- a/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java
@@ -46,6 +46,8 @@
     private static final String HELLO = "test/resources/helloWorld.pdf";
     private static final String TABLE = "test/resources/emptyRowTable.pdf";
     private static final String OTF = "test/resources/otf.pdf";
+    private static final String IMAGE = "test/resources/hello2.pdf";
+    private static final String NOPARENTTREE = "test/resources/NoParentTree.pdf";
     private PDFPage pdfPage;
     private PDFDocument pdfDoc;
 
@@ -74,12 +76,15 @@
 
     private String print(PDFStructElem x) throws IOException {
         StringBuilder sb = new StringBuilder(x.get("S").toString());
-        for (PDFObject k : x.getKids()) {
-            if (k instanceof PDFStructElem) {
-                sb.append(print((PDFStructElem) k));
+        if (x.getKids() != null) {
+            for (PDFObject k : x.getKids()) {
+                if (k instanceof PDFStructElem) {
+                    sb.append(print((PDFStructElem) k));
+                }
             }
+            return sb.toString();
         }
-        return sb.toString();
+        return "";
     }
 
     private void runConductor(String pdf, PDFStructElem elem) throws IOException {
@@ -138,4 +143,18 @@
             Assert.assertEquals(test, expected);
         }
     }
+
+    @Test
+    public void testTaggedImagePDF() throws IOException {
+        PDFStructElem elem = new PDFStructElem();
+        runConductor(IMAGE, elem);
+        Assert.assertEquals(print(elem), "/Div/Part/Sect/P/Image");
+    }
+
+    @Test
+    public void testCreateDirectDescendants() throws IOException {
+        PDFStructElem elem = new PDFStructElem();
+        runConductor(NOPARENTTREE, elem);
+        Assert.assertEquals(print(elem), "/Div/Document");
+    }
 }
diff --git a/test/resources/hello2.pdf b/test/resources/hello2.pdf
new file mode 100644
index 0000000..9e6e1d7
--- /dev/null
+++ b/test/resources/hello2.pdf
Binary files differ
diff --git a/test/resources/missingOBJR.pdf b/test/resources/missingOBJR.pdf
new file mode 100644
index 0000000..b309cb8
--- /dev/null
+++ b/test/resources/missingOBJR.pdf
Binary files differ
diff --git a/test/resources/taggedWorld.pdf b/test/resources/taggedWorld.pdf
new file mode 100644
index 0000000..77530ef
--- /dev/null
+++ b/test/resources/taggedWorld.pdf
Binary files differ