Author: tilman
Date: Mon Aug 24 18:15:20 2026
New Revision: 1937380

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

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

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
        Mon Aug 24 18:15:16 2026        (r1937379)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
        Mon Aug 24 18:15:20 2026        (r1937380)
@@ -822,8 +822,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/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java
    Mon Aug 24 18:15:16 2026        (r1937379)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/annotation/AppearanceGenerationTest.java
    Mon Aug 24 18:15:20 2026        (r1937380)
@@ -86,14 +86,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);
@@ -134,10 +158,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