Author: tilman
Date: Mon Aug 24 18:15:16 2026
New Revision: 1937379

Log:
PDFBOX-3353: expand existing test; return DeviceGray annotation color if R=G=B

Modified:
   
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
   
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java

Modified: 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
 Mon Aug 24 15:41:25 2026        (r1937378)
+++ 
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
 Mon Aug 24 18:15:16 2026        (r1937379)
@@ -820,8 +820,17 @@ public abstract class PDAnnotation imple
                 colorSpace = PDDeviceGray.INSTANCE;
                 break;
             case 3:
-                colorSpace = PDDeviceRGB.INSTANCE;
-                break;
+                float[] fa = cs.toFloatArray();
+                if (fa[0] == fa[1] && fa[2] == fa[1])
+                {
+                    // discovered while working on 
AppearanceGenerationTest.rectangleFullStrokeNoFill():
+                    // Adobe converts "rg" into "g" so lets do that too.
+                    return new PDColor(new float[]{fa[0]}, 
PDDeviceGray.INSTANCE);
+                }
+                else
+                {
+                    return new PDColor(fa, PDDeviceRGB.INSTANCE);
+                }
             case 4:
                 colorSpace = PDDeviceCMYK.INSTANCE;
                 break;

Modified: 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java
==============================================================================
--- 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java
     Mon Aug 24 15:41:25 2026        (r1937378)
+++ 
pdfbox/branches/3.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java
     Mon Aug 24 18:15:16 2026        (r1937379)
@@ -85,14 +85,38 @@ class AppearanceGenerationTest
         OUT_DIR.mkdirs();
     }
     
-    // Test currently disabled as the content stream differs
+    // Test incomplete as the content stream differs
     @Test
     void rectangleFullStrokeNoFill() throws IOException
     {
         PDPage page = document.getPage(0);
         
-        PDAnnotation annotation = page.getAnnotations().get(0);
-        
+        List<PDAnnotation> annotations = page.getAnnotations();
+        // can't do 14 and 16 (clouds, by our own algorithm)
+        // odd annotations are popups
+        checkAnnotationTokens(annotations.get(0));
+        checkAnnotationTokens(annotations.get(2));
+        checkAnnotationTokens(annotations.get(4));
+        checkAnnotationTokens(annotations.get(6));
+        checkAnnotationTokens(annotations.get(8));
+        checkAnnotationTokens(annotations.get(10));
+        checkAnnotationTokens(annotations.get(12));
+        checkAnnotationTokens(annotations.get(18));
+        checkAnnotationTokens(annotations.get(20));
+        checkAnnotationTokens(annotations.get(24));
+        checkAnnotationTokens(annotations.get(26));
+        checkAnnotationTokens(annotations.get(28));
+        checkAnnotationTokens(annotations.get(30));
+        checkAnnotationTokens(annotations.get(32));
+        checkAnnotationTokens(annotations.get(34));
+
+        // Save the file for manual comparison for now
+        File file = new File(OUT_DIR, NAME_OF_PDF + "-newAP.pdf");
+        document.save(file);
+    }
+
+    private void checkAnnotationTokens(PDAnnotation annotation) throws 
IOException
+    {
         // get the tokens of the content stream generated by Adobe
         PDAppearanceStream appearanceContentStream = 
annotation.getNormalAppearanceStream();
         PDFStreamParser streamParser = new 
PDFStreamParser(appearanceContentStream);
@@ -133,10 +157,6 @@ class AppearanceGenerationTest
             }
             actualToken++;
         }
-        
-        // Save the file for manual comparison for now
-        File file = new File(OUT_DIR, NAME_OF_PDF + "-newAP.pdf");
-        document.save(file);
     }
     
     

Reply via email to