Author: tilman
Date: Thu Feb  6 09:56:17 2025
New Revision: 1923610

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

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

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1923610&r1=1923609&r2=1923610&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java 
Thu Feb  6 09:56:17 2025
@@ -1580,6 +1580,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
@@ -1588,6 +1598,7 @@ public class PageDrawer extends PDFGraph
                     rect.getLowerLeftX(), rect.getUpperRightY());
             super.showAnnotation(annotation);
             graphics.setTransform(savedTransform);
+            annotation.setAppearance(appearance); // restore
         }
         else
         {
@@ -1595,6 +1606,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}
      */


Reply via email to