FOP-2682: ClassCastException in PageParentTreeFinder
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1779911 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/build.xml b/build.xml
index 28bb27d..1d9939b 100644
--- a/build.xml
+++ b/build.xml
@@ -448,6 +448,7 @@
<class location="${build.unit.tests.dir}"/>
<auxClasspath>
<path refid="libs-build-classpath"/>
+ <path refid="libs-build-tools-classpath"/>
<path>
<fileset dir="${ant.library.dir}">
<include name="ant.jar"/>
@@ -458,4 +459,22 @@
</findbugs>
<fail if="findbugs.warnings"/>
</target>
+
+ <target name="jar-sources" description="Generates a jar file with all the sources">
+ <tstamp>
+ <format property="ts" pattern="yyyyMMdd-HHmmss-z"/>
+ </tstamp>
+ <patternset id="java-only">
+ <include name="**/*.java"/>
+ </patternset>
+ <jar jarfile="${build.dir}/${name}-${version}-sources.jar">
+ <fileset dir="${src.java.dir}">
+ <patternset refid="java-only"/>
+ </fileset>
+ <fileset dir="${basedir}">
+ <include name="LICENSE"/>
+ <include name="NOTICE"/>
+ </fileset>
+ </jar>
+ </target>
</project>
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java b/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
index 92d5139..0aa5950 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
@@ -35,7 +35,7 @@
public class PageParentTreeFinder {
- PDPage srcPage;
+ private PDPage srcPage;
public PageParentTreeFinder(PDPage srcPage) {
this.srcPage = srcPage;
}
@@ -57,7 +57,7 @@
Iterable<COSName> mapXObject = srcPage.getResources().getXObjectNames();
for (COSName n : mapXObject) {
PDXObject t = srcPage.getResources().getXObject(n);
- COSDictionary xObjectDict = (COSDictionary)t.getCOSObject();
+ COSDictionary xObjectDict = t.getCOSObject();
position = xObjectDict.getInt(COSName.STRUCT_PARENTS);
if (position != -1) {
return position;
@@ -77,11 +77,13 @@
parentTree = (COSArray) numberTreeNodeDict.getDictionaryObject(COSName.KIDS);
traverseKids(parentTree, position, nums);
}
+ if (nums.isEmpty()) {
+ return new COSArray();
+ }
return nums.get(0);
}
private void traverseKids(COSBase kids, int position, List<COSArray> numList) {
- COSArray pageParentTree;
if (!numList.isEmpty()) {
return;
}
@@ -95,7 +97,6 @@
COSObject kidCOSObj = (COSObject) kids;
if (kidCOSObj.getDictionaryObject(COSName.NUMS) == null) {
traverseKids(kidCOSObj.getDictionaryObject(COSName.KIDS), position, numList);
-
} else {
if (kidCOSObj.getDictionaryObject(COSName.LIMITS) != null) {
COSArray kidCOSArray = (COSArray) kidCOSObj.getDictionaryObject(COSName.LIMITS);
@@ -103,8 +104,7 @@
int upperLimit = ((COSInteger) kidCOSArray.get(1)).intValue();
if (lowerLimit <= position && position <= upperLimit) {
COSArray nums = (COSArray) kidCOSObj.getDictionaryObject(COSName.NUMS);
- pageParentTree = (COSArray) nums.getObject(((position - lowerLimit) * 2) + 1);
- numList.add(pageParentTree);
+ numList.add(extractMarkedContentParents(nums, position));
}
} else {
COSArray nums = (COSArray) kidCOSObj.getDictionaryObject(COSName.NUMS);
diff --git a/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java b/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
index 854ea7d..750bc07 100644
--- a/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
@@ -31,6 +31,7 @@
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode;
import org.apache.fop.render.pdf.pdfbox.PageParentTreeFinder;
@@ -62,6 +63,7 @@
test = secondKid.getInt("MCID");
expected = 1;
Assert.assertEquals(test, expected);
+ doc.close();
}
@Test
@@ -75,4 +77,18 @@
int test = parentTree.size();
Assert.assertEquals(test, 0);
}
+
+ @Test
+ public void testTraverseKids() throws IOException {
+ PDDocument doc = PDDocument.load(new File(LINK));
+ PDNumberTreeNode srcNumberTreeNode = doc.getDocumentCatalog().getStructureTreeRoot().getParentTree();
+ COSArray parentTree = (COSArray) srcNumberTreeNode.getCOSObject().getDictionaryObject(COSName.KIDS);
+ COSObject kidCOSObj = (COSObject) parentTree.get(0);
+ COSArray nums = (COSArray) kidCOSObj.getDictionaryObject(COSName.NUMS);
+ nums.add(0, COSInteger.get(9));
+ nums.add(1, new COSDictionary());
+ COSArray numList = new PageParentTreeFinder(doc.getPage(0)).getPageParentTreeArray(doc);
+ Assert.assertEquals(numList.size(), 3);
+ doc.close();
+ }
}