Author: ssteiner
Date: Mon Jan 23 12:19:11 2017
New Revision: 1779919
URL: http://svn.apache.org/viewvc?rev=1779919&view=rev
Log:
FOP-2683: PDF Annotation ClassCastException
Modified:
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java
Modified:
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java?rev=1779919&r1=1779918&r2=1779919&view=diff
==============================================================================
---
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
(original)
+++
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
Mon Jan 23 12:19:11 2017
@@ -638,16 +638,10 @@ public class PDFBoxAdapter {
exclude.add(COSName.P);
if (annot1 instanceof COSObject) {
COSObject annot = (COSObject) annot1;
- COSObject fieldObject = annot;
- COSDictionary field = (COSDictionary)
fieldObject.getObject();
- COSObject parent;
- while ((parent = (COSObject)
field.getItem(COSName.PARENT)) != null) {
- fieldObject = parent;
- field = (COSDictionary) fieldObject.getObject();
- }
- fields.add(fieldObject);
+ getField(annot, fields);
+
- if (((COSDictionary)
annot.getObject()).getItem(COSName.getPDFName("StructParent")) != null) {
+ if (((COSDictionary)
annot.getObject()).getItem(COSName.STRUCT_PARENT) != null) {
exclude.add(COSName.PARENT);
}
}
@@ -663,6 +657,25 @@ public class PDFBoxAdapter {
return fields;
}
+ private COSDictionary getField(COSObject fieldObject, Set<COSObject>
fields) {
+ COSDictionary field = (COSDictionary) fieldObject.getObject();
+ COSObject parent;
+ while ((parent = getParent(field)) != null) {
+ fieldObject = parent;
+ field = (COSDictionary) fieldObject.getObject();
+ }
+ fields.add(fieldObject);
+ return field;
+ }
+
+ private COSObject getParent(COSDictionary field) {
+ COSBase parent = field.getItem(COSName.PARENT);
+ if (parent instanceof COSObject) {
+ return (COSObject) parent;
+ }
+ return null;
+ }
+
static class CompareFields implements Comparator<COSObject>, Serializable {
private static final long serialVersionUID = -6081505461660440801L;
Modified:
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java?rev=1779919&r1=1779918&r2=1779919&view=diff
==============================================================================
---
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
(original)
+++
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
Mon Jan 23 12:19:11 2017
@@ -194,8 +194,7 @@ public class StructureTreeMerger {
copyElemEntries(cosParentElem, elemParent);
elem.setParent(elemParent);
fillKidsWithNull(elemParent,
(COSDictionary)cosParentElem.getObject());
- if
(((COSName)parentElemDictionary.getDictionaryObject(COSName.S)).getName()
- .equals(StandardStructureTypes.TR)) {
+ if (parentElemDictionary.getDictionaryObject(COSName.S) ==
COSName.TR) {
COSBase rowKids = parentElemDictionary.getItem(COSName.K);
createKids(rowKids, parentElemDictionary, elemParent, true);
} else {
@@ -378,7 +377,7 @@ public class StructureTreeMerger {
for (COSBase base : originalParentTree) {
if (base instanceof COSNull || base == null) {
complete.add(null);
- } else {
+ } else if (!list.isEmpty()) {
complete.add(list.get(0));
list.remove(0);
}
Modified:
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java?rev=1779919&r1=1779918&r2=1779919&view=diff
==============================================================================
---
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
(original)
+++
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
Mon Jan 23 12:19:11 2017
@@ -28,6 +28,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@@ -44,8 +45,11 @@ import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
import org.apache.fontbox.ttf.TTFParser;
import org.apache.fontbox.type1.Type1Font;
+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;
@@ -112,10 +116,10 @@ public class PDFBoxAdapterTestCase {
private static final String XFORM = "test/resources/xform.pdf";
private static final String LOOP = "test/resources/loop.pdf";
- private PDFBoxAdapter getPDFBoxAdapter() {
+ private PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
PDFDocument doc = new PDFDocument("");
PDFPage pdfpage = new PDFPage(new PDFResources(doc), 0, r, r, r, r);
- doc.setMergeFontsEnabled(true);
+ doc.setMergeFontsEnabled(mergeFonts);
pdfpage.setDocument(doc);
pdfpage.setObjectNumber(1);
return new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer,
PDFArray>());
@@ -180,7 +184,7 @@ public class PDFBoxAdapterTestCase {
PDDocument doc = PDDocument.load(new File(pdf));
PDPage page = doc.getDocumentCatalog().getPages().get(0);
AffineTransform at = new AffineTransform();
- String c = getPDFBoxAdapter().createStreamFromPDFBoxPage(doc, page,
pdf, at, fi, new Rectangle());
+ String c = getPDFBoxAdapter(true).createStreamFromPDFBoxPage(doc,
page, pdf, at, fi, new Rectangle());
// PDResources sourcePageResources = page.findResources();
// COSDictionary fonts =
(COSDictionary)sourcePageResources.getCOSDictionary().getDictionaryObject(COSName.FONT);
// PDFBoxAdapter.PDFWriter w = adapter. new MergeFontsPDFWriter(fonts,
fi, "", new ArrayList<COSName>());
@@ -356,6 +360,21 @@ public class PDFBoxAdapterTestCase {
}
@Test
+ public void testAnnot2() throws Exception {
+ PDFBoxAdapter adapter = getPDFBoxAdapter(false);
+ PDDocument doc = PDDocument.load(new File(ANNOT));
+ PDPage page = doc.getDocumentCatalog().getPages().get(0);
+ COSArray annots = (COSArray)
page.getCOSObject().getDictionaryObject(COSName.ANNOTS);
+ COSDictionary dict = (COSDictionary)
((COSObject)annots.get(0)).getObject();
+ dict.setItem(COSName.PARENT, COSInteger.ONE);
+
+ AffineTransform at = new AffineTransform();
+ Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+ adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+ doc.close();
+ }
+
+ @Test
public void testLink() throws Exception {
PDFDocument pdfdoc = new PDFDocument("");
PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
@@ -378,7 +397,7 @@ public class PDFBoxAdapterTestCase {
@Test
public void testXform() throws Exception {
PDFDocument pdfdoc = new PDFDocument("");
- pdfdoc.getFilterMap().put(PDFFilterList.DEFAULT_FILTER,
Arrays.asList("null"));
+ pdfdoc.getFilterMap().put(PDFFilterList.DEFAULT_FILTER,
Collections.singletonList("null"));
pdfdoc.setMergeFontsEnabled(true);
PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
pdfpage.setDocument(pdfdoc);
Modified:
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java?rev=1779919&r1=1779918&r2=1779919&view=diff
==============================================================================
---
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java
(original)
+++
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerUtilTestCase.java
Mon Jan 23 12:19:11 2017
@@ -35,9 +35,9 @@ public class StructureTreeMergerUtilTest
COSDictionary rolemap = new COSDictionary();
COSName key1 = COSName.getPDFName("Para");
- COSName value1 = COSName.getPDFName("P");
+ COSName value1 = COSName.P;
COSName key2 = COSName.getPDFName("Icon");
- COSName value2 = COSName.getPDFName("Image");
+ COSName value2 = COSName.IMAGE;
rolemap.setItem(key1, value1);
rolemap.setItem(key2, value2);
String type = "Image";
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]