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();
+    }
 }