Jakob Heher created PDFBOX-6271:
-----------------------------------

             Summary: `getNormalAppearanceStream` marks annotation appearance 
stream as dirty
                 Key: PDFBOX-6271
                 URL: https://issues.apache.org/jira/browse/PDFBOX-6271
             Project: PDFBox
          Issue Type: Bug
    Affects Versions: 3.0.6 PDFBox
            Reporter: Jakob Heher
         Attachments: Repro2FormXObjectConstructor.java, double-signed.pdf

Calling `getNormalAppearanceStream` on an annotation marks the appearance 
stream as dirty. This causes it to be re-emitted in a subsequent incremental 
update save.

In particular, Renderer's `renderPageToGraphics` can also trigger this bug 
down-stack (which is how we ran into it; we render the document page to 
determine where to place a subsequent signature annotation, and the previous 
signature annotation's appearance stream was re-emitted).

The cause is that the `PDXObject` constructor taking `COSStream` (which the 
`PDFormXObject` constructor delegates to) unconditionally calls `setName` -> 
`setItem` to set the correct type/subtype values. `setItem` then 
unconditionally marks the dictionary as dirty. This is the same fundamental 
cause as PDFBOX-6270.

A minimal reproducer is attached. A sample PDF file exhibiting this bug is also 
attached.

A suggested fix would be to make the `setItem` invocations conditional. This 
likely applies to more than just PDFormXObject, it is just the context in which 
we encountered the bug.

*AI disclaimer:* I used ChatGPT to perform the cause analysis after noticing 
the erroneous behavior in production, and to generate an initial reproducer. 
However, I have manually refined the reproducer, and have manually verified the 
erroneous behavior in the source tree. I have written this bug report by hand. 
I am confident that this is a real bug.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to