FOP-2698: NPE when page resource missing
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1785316 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
index d258466..702fcf6 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
@@ -348,10 +348,10 @@
if (pageNumbers.containsKey(targetPage.getPageIndex())) {
pageNumbers.get(targetPage.getPageIndex()).set(0, targetPage.makeReference());
}
- PDResources sourcePageResources = page.getResources();
+ COSDictionary sourcePageResources = getResources(page);
PDStream pdStream = getContents(page);
- COSDictionary fonts = (COSDictionary)sourcePageResources.getCOSObject().getDictionaryObject(COSName.FONT);
+ COSDictionary fonts = (COSDictionary)sourcePageResources.getDictionaryObject(COSName.FONT);
COSDictionary fontsBackup = null;
UniqueName uniqueName = new UniqueName(key, sourcePageResources);
String newStream = null;
@@ -375,8 +375,8 @@
}
pdStream = new PDStream(sourceDoc, new ByteArrayInputStream(newStream.getBytes("ISO-8859-1")));
- mergeXObj(sourcePageResources.getCOSObject(), fontinfo, uniqueName);
- PDFDictionary pageResources = (PDFDictionary)cloneForNewDocument(sourcePageResources.getCOSObject());
+ mergeXObj(sourcePageResources, fontinfo, uniqueName);
+ PDFDictionary pageResources = (PDFDictionary)cloneForNewDocument(sourcePageResources);
PDFDictionary fontDict = (PDFDictionary)pageResources.get("Font");
if (fontDict != null && pdfDoc.isMergeFontsEnabled()) {
@@ -392,9 +392,9 @@
}
}
}
- updateXObj(sourcePageResources.getCOSObject(), pageResources);
+ updateXObj(sourcePageResources, pageResources);
if (fontsBackup != null) {
- sourcePageResources.getCOSObject().setItem(COSName.FONT, fontsBackup);
+ sourcePageResources.setItem(COSName.FONT, fontsBackup);
}
COSStream originalPageContents = pdStream.getCOSObject();
@@ -462,6 +462,14 @@
return pdStream;
}
+ private COSDictionary getResources(PDPage page) {
+ PDResources res = page.getResources();
+ if (res == null) {
+ return new COSDictionary();
+ }
+ return res.getCOSObject();
+ }
+
private void mergeXObj(COSDictionary sourcePageResources, FontInfo fontinfo, UniqueName uniqueName)
throws IOException {
COSDictionary xobj = (COSDictionary) sourcePageResources.getDictionaryObject(COSName.XOBJECT);
@@ -515,7 +523,7 @@
}
}
- private void transferPageDict(COSDictionary fonts, UniqueName uniqueName, PDResources sourcePageResources)
+ private void transferPageDict(COSDictionary fonts, UniqueName uniqueName, COSDictionary sourcePageResources)
throws IOException {
if (fonts != null) {
for (Map.Entry<COSName, COSBase> f : fonts.entrySet()) {
@@ -523,7 +531,7 @@
targetPage.getPDFResources().addFont(name, (PDFDictionary)cloneForNewDocument(f.getValue()));
}
}
- for (Map.Entry<COSName, COSBase> e : sourcePageResources.getCOSObject().entrySet()) {
+ for (Map.Entry<COSName, COSBase> e : sourcePageResources.entrySet()) {
transferDict(e, uniqueName);
}
}
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java b/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
index a65b736..4bd61b6 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
@@ -25,15 +25,14 @@
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSObject;
-import org.apache.pdfbox.pdmodel.PDResources;
public class UniqueName {
private String key;
private List<COSName> resourceNames;
- public UniqueName(String key, PDResources sourcePageResources) {
+ public UniqueName(String key, COSDictionary sourcePageResources) {
this.key = Integer.toString(key.hashCode());
- resourceNames = getResourceNames(sourcePageResources.getCOSObject());
+ resourceNames = getResourceNames(sourcePageResources);
}
protected String getName(COSName cn) {
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 401c2a3..c9dd620 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -460,4 +460,14 @@
}
Assert.assertTrue(msg.startsWith("Error on PDF page: " + ERROR));
}
+
+ @Test
+ public void testNoPageResource() throws IOException {
+ PDDocument doc = PDDocument.load(new File(CFF1));
+ PDPage page = doc.getPage(0);
+ page.setResources(null);
+ AffineTransform at = new AffineTransform();
+ getPDFBoxAdapter(false).createStreamFromPDFBoxPage(doc, page, CFF1, at, new FontInfo(), new Rectangle());
+ doc.close();
+ }
}