DvdM created PDFBOX-4788:
----------------------------
Summary: Flattening fields results in non-widget annotations being
removed
Key: PDFBOX-4788
URL: https://issues.apache.org/jira/browse/PDFBOX-4788
Project: PDFBox
Issue Type: Bug
Components: AcroForm
Affects Versions: 2.0.19
Reporter: DvdM
Attachments: CreateDocument.java, FlattenDocument.java, flatten.pdf,
flattened.pdf
I'm running into an issue when flattening form fields, using PDFBox version
v2.0.19. When calling {{PDAcroForm.flatten()}}, all annotations on pages
without form fields get removed.
I created an sample document to illustrate this issue, it document contains 2
pages:
* page 1: a text field and a link annotation
* page 2: only a link annotation
When you flatten this document, the link annotation on the 2nd page gets
removed, while it shouldn't be.
PDF Documents and Java files to reproduce this are attached:
* {{CreateDocument.java}} creates {{flatten.pdf}}
* {{FlattenDocument.java}} flattens {{flatten.pdf}} and creates
{{flattened.pdf}}
----
After debugging, I think I found the cause. In the {{PDAcroForm}} class,
{{flatten(...)}} calls the {{buildPagesWidgetsMap(...)}} method, which iterates
over the form fields and builds a map of pages and their widget annotations.
Because the 2nd page doesn't contain widget annotations, this page is not added
to the map. Then {{flatten()}} iterates over the pages and gets the widgets for
that page from the created {{pagesWidgetsMap}} map. However, because the 2nd
page didn't have annotations and therefore wasn't added to the map, this
results in {{widgetsForPageMap}} being {{null}}.
Next, for every annotation on this page, the following check is performed:
{code:java}
if (widgetsForPageMap != null &&
!widgetsForPageMap.contains(annotation.getCOSObject()))
{
annotations.add(annotation);
}
{code}
Because {{widgetsForPageMap}} is {{null}}, the annotations is not added to the
{{annotations}} list and therefore not retained in the document. The first page
did contain a field and is thus added to the {{pagesWidgetsMap}}, resulting in
{{widgetsForPageMap}} not being null, the annotation being added the
{{annotations}} list and thus the annotation is retained.
I thinks this issue could be solved by using:
{code:java}
if (widgetsForPageMap == null ||
!widgetsForPageMap.contains(annotation.getCOSObject()))
{
annotations.add(annotation);
}
{code}
Please let me know if you have any questions!
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]