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/05/19 05:36:04 UTC

svn commit: r1909921 - /pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/printing/OpaquePDFRenderer.java

Author: tilman
Date: Fri May 19 05:36:03 2023
New Revision: 1909921

URL: http://svn.apache.org/viewvc?rev=1909921&view=rev
Log:
PDFBOX-5605: add processor that sets default values for ca and CA

Modified:
    pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/printing/OpaquePDFRenderer.java

Modified: pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/printing/OpaquePDFRenderer.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/printing/OpaquePDFRenderer.java?rev=1909921&r1=1909920&r2=1909921&view=diff
==============================================================================
--- pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/printing/OpaquePDFRenderer.java (original)
+++ pdfbox/branches/2.0/examples/src/main/java/org/apache/pdfbox/examples/printing/OpaquePDFRenderer.java Fri May 19 05:36:03 2023
@@ -29,6 +29,7 @@ import org.apache.commons.logging.LogFac
 import org.apache.pdfbox.contentstream.operator.MissingOperandException;
 import org.apache.pdfbox.contentstream.operator.Operator;
 import org.apache.pdfbox.contentstream.operator.OperatorName;
+import org.apache.pdfbox.contentstream.operator.OperatorProcessor;
 import org.apache.pdfbox.contentstream.operator.graphics.GraphicsOperatorProcessor;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSName;
@@ -37,6 +38,7 @@ import org.apache.pdfbox.pdmodel.PDDocum
 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.state.PDExtendedGraphicsState;
 import org.apache.pdfbox.printing.PDFPrintable;
 import org.apache.pdfbox.printing.Scaling;
 import org.apache.pdfbox.rendering.PDFRenderer;
@@ -44,11 +46,12 @@ import org.apache.pdfbox.rendering.PageD
 import org.apache.pdfbox.rendering.PageDrawerParameters;
 
 /**
- * PDF documents with transparency groups are sometimes printed slowly and in poor quality, see
- * <a href="https://issues.apache.org/jira/browse/PDFBOX-4123">PDFBOX-4123</a>. If the transparency
- * groups aren't really needed (e.g. for most labels), we can use a custom PDFRenderer / PageDrawer
- * that uses a custom DrawObject class which doesn't call showTransparencyGroup() but only
- * showForm().
+ * PDF documents with transparency are sometimes printed slowly and in poor quality, see
+ * <a href="https://issues.apache.org/jira/browse/PDFBOX-4123">PDFBOX-4123</a> and
+ * <a href="https://issues.apache.org/jira/browse/PDFBOX-5605">PDFBOX-5605</a>. If the transparency
+ * isn't really needed (e.g. for most labels), we can use a custom PDFRenderer / PageDrawer that
+ * uses a custom DrawObject class which doesn't call showTransparencyGroup() but only showForm() and
+ * sets ca and CA to 1.
  * <p>
  * This OpaquePDFRenderer class object can be passed to the "long" constructor of
  * {@link PDFPrintable#PDFPrintable(org.apache.pdfbox.pdmodel.PDDocument, org.apache.pdfbox.printing.Scaling, boolean, float, boolean, org.apache.pdfbox.rendering.PDFRenderer)}.
@@ -61,7 +64,10 @@ public class OpaquePDFRenderer extends P
     public static void main(String[] args) throws IOException, PrinterException
     {
         // PDF from the QZ Tray project, who reported this problem.
-        InputStream is = new URL("https://github.com/qzind/tray/files/1749977/test.pdf").openStream();
+        // Also test with
+        // https://github.com/qzind/tray/files/11432463/sample_file-1.pdf
+        // (second page)
+        InputStream is = new URL("https://github.com/qzind/tray/files/11432463/sample_file-1.pdf").openStream();
         PDDocument doc = PDDocument.load(is);
         is.close();
         PDFRenderer renderer = new OpaquePDFRenderer(doc);
@@ -94,6 +100,7 @@ public class OpaquePDFRenderer extends P
         {
             super(parameters);
             addOperator(new OpaqueDrawObject());
+            addOperator(new OpaqueSetGraphicsStateParameters());
         }
     }
 
@@ -153,4 +160,44 @@ public class OpaquePDFRenderer extends P
             return OperatorName.DRAW_OBJECT;
         }
     }
+    
+    // copied from org.apache.pdfbox.contentstream.operator.state.SetGraphicsStateParameters()
+    // but resets ca and CA
+    private static class OpaqueSetGraphicsStateParameters extends OperatorProcessor
+    {
+        private static final Log LOG = LogFactory.getLog(OpaqueSetGraphicsStateParameters.class);
+
+        @Override
+        public void process(Operator operator, List<COSBase> arguments) throws IOException
+        {
+            if (arguments.isEmpty())
+            {
+                throw new MissingOperandException(operator, arguments);
+            }
+            COSBase base0 = arguments.get(0);
+            if (!(base0 instanceof COSName))
+            {
+                return;
+            }
+
+            // set parameters from graphics state parameter dictionary
+            COSName graphicsName = (COSName) base0;
+            PDExtendedGraphicsState gs = context.getResources().getExtGState(graphicsName);
+            if (gs == null)
+            {
+                LOG.error("name for 'gs' operator not found in resources: /" + graphicsName.getName());
+                return;
+            }
+            gs.setNonStrokingAlphaConstant(1f);
+            gs.setStrokingAlphaConstant(1f);
+            gs.copyIntoGraphicsState(context.getGraphicsState());
+        }
+
+        @Override
+        public String getName()
+        {
+            return OperatorName.SET_GRAPHICS_STATE_PARAMS;
+        }
+    }
+
 }