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: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org