PDFBOX-5551: replace malformed (sub)stream with an empty one, DRY

git-svn-id: https://svn.apache.org/repos/asf/pdfbox/trunk@1910585 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
index 9d72cfb..7de3d33 100644
--- a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
+++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
@@ -19,9 +19,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.SequenceInputStream;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -35,6 +33,7 @@
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.cos.COSStream;
+import org.apache.pdfbox.io.RandomAccessInputStream;
 import org.apache.pdfbox.io.RandomAccessRead;
 import org.apache.pdfbox.io.RandomAccessReadBuffer;
 import org.apache.pdfbox.io.SequenceRandomAccessRead;
@@ -155,27 +154,10 @@
     @Override
     public InputStream getContents() throws IOException
     {
-        COSBase base = page.getDictionaryObject(COSName.CONTENTS);
-        if (base instanceof COSStream)
+        RandomAccessRead contentsForRandomAccess = getContentsForRandomAccess();
+        if (contentsForRandomAccess != null)
         {
-            return ((COSStream)base).createInputStream();
-        }
-        else if (base instanceof COSArray && ((COSArray) base).size() > 0)
-        {
-            COSArray streams = (COSArray)base;
-            byte[] delimiter = new byte[] { '\n' };
-            List<InputStream> inputStreams = new ArrayList<>();
-            for (int i = 0; i < streams.size(); i++)
-            {
-                COSBase strm = streams.getObject(i);
-                if (strm instanceof COSStream)
-                {
-                    COSStream stream = (COSStream) strm;
-                    inputStreams.add(stream.createInputStream());
-                    inputStreams.add(new ByteArrayInputStream(delimiter));
-                }
-            }
-            return new SequenceInputStream(Collections.enumeration(inputStreams));
+            return new RandomAccessInputStream(contentsForRandomAccess);
         }
         return new ByteArrayInputStream(new byte[0]);
     }
@@ -186,7 +168,15 @@
         COSBase base = page.getDictionaryObject(COSName.CONTENTS);
         if (base instanceof COSStream)
         {
-            return ((COSStream) base).createView();
+            try
+            {
+                return ((COSStream) base).createView();
+            }
+            catch (IOException exception)
+            {
+                LOG.warn("skipped malformed content stream");
+                return new RandomAccessReadBuffer(new byte[] { '\n' });
+            }
         }
         else if (base instanceof COSArray && ((COSArray) base).size() > 0)
         {
@@ -198,8 +188,16 @@
                 COSBase strm = streams.getObject(i);
                 if (strm instanceof COSStream)
                 {
-                    inputStreams.add(((COSStream) strm).createView());
-                    inputStreams.add(new RandomAccessReadBuffer(delimiter));
+                    try
+                    {
+                        RandomAccessRead subStream = ((COSStream) strm).createView();
+                        inputStreams.add(subStream);
+                        inputStreams.add(new RandomAccessReadBuffer(delimiter));
+                    }
+                    catch (IOException exception)
+                    {
+                        LOG.warn("malformed substream of content stream skipped");
+                    }
                 }
             }
             if (!inputStreams.isEmpty())