You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2020/08/26 18:15:07 UTC

svn commit: r1881224 - /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java

Author: tilman
Date: Wed Aug 26 18:15:06 2020
New Revision: 1881224

URL: http://svn.apache.org/viewvc?rev=1881224&view=rev
Log:
PDFBOX-4847: refactor, split large method

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java?rev=1881224&r1=1881223&r2=1881224&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PNGConverter.java Wed Aug 26 18:15:06 2020
@@ -394,61 +394,71 @@ final class PNGConverter
         if (state.iCCP != null || state.sRGB != null)
         {
             // We have got a color profile, which we must attach
+            COSStream cosStream = createCOSStreamwithIccProfile(document, colorSpace, state);
+            if (cosStream == null)
+            {
+                return null;
+            }
             COSArray array = new COSArray();
             array.add(COSName.ICCBASED);
-            PDStream pdStream = new PDStream(document);
-            array.add(pdStream);
-            COSStream cosStream = pdStream.getCOSObject();
-            cosStream.setInt(COSName.N, colorSpace.getNumberOfComponents());
-            cosStream.setItem(COSName.ALTERNATE, colorSpace.getNumberOfComponents()
-                    == 1 ? COSName.DEVICEGRAY : COSName.DEVICERGB);
-            cosStream.setItem(COSName.FILTER, COSName.FLATE_DECODE);
-            if (state.iCCP != null)
-            {
-                // We need to skip over the name
-                int iccProfileDataStart = 0;
-                while (iccProfileDataStart < 80 && iccProfileDataStart < state.iCCP.length)
-                {
-                    if (state.iCCP.bytes[state.iCCP.start + iccProfileDataStart] == 0)
-                        break;
-                    iccProfileDataStart++;
-                }
-                iccProfileDataStart++;
-                if (iccProfileDataStart >= state.iCCP.length)
-                {
-                    LOG.error("Invalid iCCP chunk, to few bytes");
-                    return null;
-                }
-                byte compressionMethod = state.iCCP.bytes[state.iCCP.start + iccProfileDataStart];
-                if (compressionMethod != 0)
-                {
-                    LOG.error(String.format("iCCP chunk: invalid compression method %d",
-                            compressionMethod));
-                    return null;
-                }
-                // Skip over the compression method
-                iccProfileDataStart++;
+            array.add(cosStream);
+            PDICCBased profile = PDICCBased.create(array, null);
+            imageXObject.setColorSpace(profile);
+        }
+        return imageXObject;
+    }
 
-                try (OutputStream rawOutputStream = cosStream.createRawOutputStream())
+    private static COSStream createCOSStreamwithIccProfile
+        (PDDocument document, PDColorSpace colorSpace, PNGConverterState state) throws IOException
+    {
+        COSStream cosStream = document.getDocument().createCOSStream();
+        cosStream.setInt(COSName.N, colorSpace.getNumberOfComponents());
+        cosStream.setItem(COSName.ALTERNATE, colorSpace.getNumberOfComponents()
+                == 1 ? COSName.DEVICEGRAY : COSName.DEVICERGB);
+        cosStream.setItem(COSName.FILTER, COSName.FLATE_DECODE);
+        if (state.iCCP != null)
+        {
+            // We need to skip over the name
+            int iccProfileDataStart = 0;
+            while (iccProfileDataStart < 80 && iccProfileDataStart < state.iCCP.length)
+            {
+                if (state.iCCP.bytes[state.iCCP.start + iccProfileDataStart] == 0)
                 {
-                    rawOutputStream.write(state.iCCP.bytes, state.iCCP.start + iccProfileDataStart,
-                            state.iCCP.length - iccProfileDataStart);
+                    break;
                 }
+                iccProfileDataStart++;
             }
-            else
+            iccProfileDataStart++;
+            if (iccProfileDataStart >= state.iCCP.length)
             {
-                // We tag the image with the sRGB profile
-                ICC_Profile rgbProfile = ICC_Profile.getInstance(ColorSpace.CS_sRGB);
-                try (OutputStream outputStream = cosStream.createOutputStream())
-                {
-                    outputStream.write(rgbProfile.getData());
-                }
+                LOG.error("Invalid iCCP chunk, to few bytes");
+                return null;
+            }
+            byte compressionMethod = state.iCCP.bytes[state.iCCP.start + iccProfileDataStart];
+            if (compressionMethod != 0)
+            {
+                LOG.error(String.format("iCCP chunk: invalid compression method %d",
+                        compressionMethod));
+                return null;
+            }
+            // Skip over the compression method
+            iccProfileDataStart++;
+            try (OutputStream rawOutputStream = cosStream.createRawOutputStream())
+            {
+                rawOutputStream.write(state.iCCP.bytes, state.iCCP.start + iccProfileDataStart,
+                        state.iCCP.length - iccProfileDataStart);
             }
-
-            PDICCBased profile = PDICCBased.create(array, null);
-            imageXObject.setColorSpace(profile);
         }
-        return imageXObject;
+        else
+        {
+            // We tag the image with the sRGB profile
+            ICC_Profile rgbProfile = ICC_Profile.getInstance(ColorSpace.CS_sRGB);
+            try (OutputStream outputStream = cosStream.createOutputStream())
+            {
+                outputStream.write(rgbProfile.getData());
+            }
+        }
+        return cosStream;
     }
 
     private static COSDictionary buildDecodeParams(PNGConverterState state, PDColorSpace colorSpace)