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 2025/02/06 09:56:06 UTC

svn commit: r1923608 - /pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Author: tilman
Date: Thu Feb  6 09:56:05 2025
New Revision: 1923608

URL: http://svn.apache.org/viewvc?rev=1923608&view=rev
Log:
PDFBOX-4744: reconstruct NoRotate annotations that have transparencies

Modified:
    pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Modified: pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1923608&r1=1923607&r2=1923608&view=diff
==============================================================================
--- pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Thu Feb  6 09:56:05 2025
@@ -1581,6 +1581,16 @@ public class PageDrawer extends PDFGraph
         }
         if (annotation.isNoRotate() && getCurrentPage().getRotation() != 0)
         {
+            appearance = annotation.getAppearance();
+            if (appearance != null && appearance.getNormalAppearance() != null &&
+                appearance.getNormalAppearance().isStream() &&
+                hasTransparency(appearance.getNormalAppearance().getAppearanceStream()))
+            {
+                // PDFBOX-4744: avoid appearances with transparency groups until we have fixed
+                // the rendering. A real solution should probably be
+                // in PDFStreamEngine.processAnnotation().
+                annotation.constructAppearances();
+            }
             PDRectangle rect = annotation.getRectangle();
             AffineTransform savedTransform = graphics.getTransform();
             // "The upper-left corner of the annotation remains at the same point in
@@ -1589,6 +1599,7 @@ public class PageDrawer extends PDFGraph
                     rect.getLowerLeftX(), rect.getUpperRightY());
             super.showAnnotation(annotation);
             graphics.setTransform(savedTransform);
+            annotation.setAppearance(appearance); // restore
         }
         else
         {
@@ -1596,6 +1607,32 @@ public class PageDrawer extends PDFGraph
         }
     }
 
+    private boolean hasTransparency(PDFormXObject form) throws IOException
+    {
+        if (form == null)
+        {
+            return false;
+        }
+        PDResources resources = form.getResources();
+        if (resources == null)
+        {
+            return false;
+        }
+        for (COSName name : resources.getXObjectNames())
+        {
+            PDXObject xObject = resources.getXObject(name);
+            if (xObject instanceof PDTransparencyGroup)
+            {
+                return true;
+            }
+            if (xObject instanceof PDFormXObject && hasTransparency((PDFormXObject) xObject))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * {@inheritDoc}
      */