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);
}