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 2023/08/19 03:18:45 UTC

svn commit: r1911761 - in /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox: cos/COSName.java filter/JPXFilter.java

Author: tilman
Date: Sat Aug 19 03:18:45 2023
New Revision: 1911761

URL: http://svn.apache.org/viewvc?rev=1911761&view=rev
Log:
PDFBOX-5657: return opaque image for JPEG2000 with SMaskInData

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java?rev=1911761&r1=1911760&r2=1911761&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java Sat Aug 19 03:18:45 2023
@@ -512,6 +512,7 @@ public final class COSName extends COSBa
     public static final COSName SIZE = new COSName("Size");
     public static final COSName SM = new COSName("SM");
     public static final COSName SMASK = new COSName("SMask");
+    public static final COSName SMASK_IN_DATA = new COSName("SMaskInData");
     public static final COSName SOFT_LIGHT = new COSName("SoftLight");
     public static final COSName SORT = new COSName("Sort");
     public static final COSName SOUND = new COSName("Sound");

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java?rev=1911761&r1=1911760&r2=1911761&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java Sat Aug 19 03:18:45 2023
@@ -16,6 +16,8 @@
  */
 package org.apache.pdfbox.filter;
 
+import java.awt.Graphics2D;
+import java.awt.Transparency;
 import java.awt.color.ColorSpace;
 import java.awt.image.BufferedImage;
 import java.awt.image.DataBuffer;
@@ -31,6 +33,10 @@ import javax.imageio.ImageReadParam;
 import javax.imageio.ImageReader;
 import javax.imageio.stream.ImageInputStream;
 import javax.imageio.stream.MemoryCacheImageInputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.graphics.color.PDJPXColorSpace;
@@ -52,6 +58,8 @@ import org.apache.pdfbox.pdmodel.graphic
  */
 public final class JPXFilter extends Filter
 {
+    private static final Log LOG = LogFactory.getLog(JPXFilter.class);
+
     /**
      * {@inheritDoc}
      */
@@ -170,6 +178,18 @@ public final class JPXFilter extends Fil
                     // in raster
                     result.setColorSpace(new PDJPXColorSpace(ColorSpace.getInstance(ColorSpace.CS_GRAY)));
                 }
+                else if (image.getTransparency() == Transparency.TRANSLUCENT &&
+                         parameters.getInt(COSName.SMASK_IN_DATA) > 0)
+                {
+                    LOG.warn("JPEG2000 SMaskInData is not supported, returning opaque image");
+                    BufferedImage bim = new BufferedImage(
+                            image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
+                    Graphics2D g2d = (Graphics2D) bim.getGraphics();
+                    g2d.drawImage(image, 0, 0, null);
+                    g2d.dispose();
+                    image = bim;
+                    result.setColorSpace(new PDJPXColorSpace(image.getColorModel().getColorSpace()));
+                }
                 else
                 {
                     result.setColorSpace(new PDJPXColorSpace(image.getColorModel().getColorSpace()));