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