[ 
https://issues.apache.org/jira/browse/PDFBOX-6270?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tilman Hausherr updated PDFBOX-6270:
------------------------------------
    Fix Version/s: 2.0.38
                   3.0.9 PDFBox
                   4.0.0

> `getAnnotations` marks annotations as dirty
> -------------------------------------------
>
>                 Key: PDFBOX-6270
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-6270
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 3.0.6 PDFBox
>            Reporter: Jakob Heher
>            Priority: Major
>             Fix For: 2.0.38, 3.0.9 PDFBox, 4.0.0
>
>         Attachments: Repro1WidgetConstructor.java, double-signed.pdf
>
>
> Calling `page.getAnnotations()` marks various already-existing annotations as 
> dirty. This causes them to be re-emitted in a subsequent incremental update 
> save, even though no mutations were performed.
> In particular, `addSignature` triggers this bug (it uses `getAnnotations`), 
> causing pre-existing signature annotations to be re-emitted byte-by byte.
> The cause is the `COSDictionary`-taking constructors of the annotation 
> wrappers unconditionally calling `setName` -> `setItem` to set the correct 
> type/subtype values. `setItem` then unconditionally marks the dictionary as 
> dirty. Cf. 
> [PDAnnotationWidget.java|https://github.com/apache/pdfbox/blob/3.0.6/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAnnotationWidget.java#L56].
>  These constructors are called from getAnnotations -> createAnnotation.
> A minimal reproducer is attached. A sample PDF file exhibiting this bug is 
> also attached.
> A suggested fix would be either to make the `setItem` invocations 
> conditional, or to skip them entirely (since the comment on this constructor 
> suggests that it assumes that the passed dictionary is already valid). This 
> likely applies to more than just PDAnnotationWidget.
> *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