You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ss...@apache.org on 2017/09/18 15:02:57 UTC

svn commit: r1808727 - in /xmlgraphics/fop-pdf-images/trunk: lib/ src/java/org/apache/fop/render/pdf/pdfbox/ test/java/org/apache/fop/render/pdf/ test/resources/

Author: ssteiner
Date: Mon Sep 18 15:02:56 2017
New Revision: 1808727

URL: http://svn.apache.org/viewvc?rev=1808727&view=rev
Log:
FOP-2739: Avoid rastering PDF with Smask to image

Added:
    xmlgraphics/fop-pdf-images/trunk/test/resources/smask.pdf   (with props)
Modified:
    xmlgraphics/fop-pdf-images/trunk/lib/xmlgraphics-commons-svn-trunk.jar
    xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java
    xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java
    xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java

Modified: xmlgraphics/fop-pdf-images/trunk/lib/xmlgraphics-commons-svn-trunk.jar
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/lib/xmlgraphics-commons-svn-trunk.jar?rev=1808727&r1=1808726&r2=1808727&view=diff
==============================================================================
Binary files - no diff available.

Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java?rev=1808727&r1=1808726&r2=1808727&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java Mon Sep 18 15:02:56 2017
@@ -39,7 +39,6 @@ import org.apache.pdfbox.pdmodel.PDResou
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.graphics.PDXObject;
 import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
-import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.pdmodel.graphics.shading.PDShading;
 import org.apache.pdfbox.rendering.PDFRenderer;
 
@@ -202,11 +201,6 @@ public class ImageConverterPDF2G2D exten
                                     && pageHasTransparency(formRes)) {
                                 return true;
                             }
-                        } else if (pdxObject instanceof PDImageXObject) {
-                            if (pdxObject.getCOSStream().containsKey(COSName.SMASK)
-                                    || ((PDImageXObject) pdxObject).isStencil()) {
-                                return true;
-                            }
                         }
                     }
                 }

Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java?rev=1808727&r1=1808726&r2=1808727&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PSPDFGraphics2D.java Mon Sep 18 15:02:56 2017
@@ -27,7 +27,10 @@ import java.awt.Image;
 import java.awt.Paint;
 import java.awt.PaintContext;
 import java.awt.Rectangle;
+import java.awt.TexturePaint;
 import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.DataBufferInt;
@@ -148,9 +151,43 @@ public class PSPDFGraphics2D extends PSG
                     handleIOException(ioe);
                 }
             }
+        } else if (paint.getClass().getSimpleName().equals("TilingPaint")) {
+            try {
+                Field f = paint.getClass().getDeclaredField("paint");
+                f.setAccessible(true);
+                TexturePaint texturePaint = (TexturePaint) f.get(paint);
+                f = paint.getClass().getDeclaredField("patternMatrix");
+                f.setAccessible(true);
+                Matrix matrix = (Matrix) f.get(paint);
+                Rectangle2D rect = getTransformedRect(matrix, texturePaint.getAnchorRect());
+                texturePaint = new TexturePaint(texturePaint.getImage(), rect);
+                super.applyPaint(texturePaint, fill);
+            } catch (NoSuchFieldException e) {
+                throw new RuntimeException(e);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
         }
     }
 
+    private static Rectangle2D getTransformedRect(Matrix matrix, Rectangle2D anchorRect) {
+        double x = anchorRect.getX();
+        double y = anchorRect.getY();
+        double width = anchorRect.getWidth();
+        double height = anchorRect.getHeight();
+        AffineTransform at = matrix.createAffineTransform();
+        Point2D p1 = new Point2D.Double(x, y);
+        Point2D p2 = new Point2D.Double(x + width, y + height);
+        at.transform(p1, p1);
+        at.transform(p2, p2);
+        Rectangle2D rectangle = new Rectangle2D.Float(
+                (float) Math.min(p1.getX(), p2.getX()),
+                (float) Math.min(p1.getY(), p2.getY()),
+                (float) Math.abs(width),
+                (float) Math.abs(height));
+        return rectangle;
+    }
+
     private void transformCoords(float[] coords, Paint paint, boolean axialShading) {
         try {
             Field f = paint.getClass().getDeclaredField("matrix");

Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java?rev=1808727&r1=1808726&r2=1808727&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java Mon Sep 18 15:02:56 2017
@@ -112,6 +112,7 @@ public class PDFBoxAdapterTestCase {
     private static final String LOOP = "test/resources/loop.pdf";
     private static final String ERROR = "test/resources/error.pdf";
     private static final String LIBREOFFICE = "test/resources/libreoffice.pdf";
+    private static final String SMASK = "test/resources/smask.pdf";
 
     private static PDFPage getPDFPage(PDFDocument doc) {
         final Rectangle2D r = new Rectangle2D.Double();
@@ -299,7 +300,7 @@ public class PDFBoxAdapterTestCase {
         pdfToPS(TTSubset3);
         pdfToPS(TTSubset5);
         stream = pdfToPS(CFFCID1);
-        Assert.assertEquals(countString(stream.toString("UTF-8"), "%AXGBeginBitmap:"), 1);
+        Assert.assertEquals(countString(stream.toString("UTF-8"), "%AXGBeginBitmap:"), 2);
         pdfToPS(CFFCID2);
         pdfToPS(Type1Subset1);
         pdfToPS(Type1Subset2);
@@ -360,6 +361,13 @@ public class PDFBoxAdapterTestCase {
     }
 
     @Test
+    public void testSmask() throws IOException, ImageException {
+        ByteArrayOutputStream ps = pdfToPS(SMASK);
+        Assert.assertTrue(ps.toString("UTF-8").contains("/Pattern"));
+        Assert.assertTrue(ps.toString("UTF-8").contains("{<\nf1f1f1"));
+    }
+
+    @Test
     public void testPCL() throws IOException, ImageException {
         String ex = "";
         try {

Added: xmlgraphics/fop-pdf-images/trunk/test/resources/smask.pdf
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/resources/smask.pdf?rev=1808727&view=auto
==============================================================================
Binary file - no diff available.

Propchange: xmlgraphics/fop-pdf-images/trunk/test/resources/smask.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org