[
https://issues.apache.org/jira/browse/PDFBOX-2677?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14318299#comment-14318299
]
Andrea Vacondio commented on PDFBOX-2677:
-----------------------------------------
I'm quite sure, you can debug the attached documents they have negative
_Outlines_ COUNT. Or just create one
{code}
PDDocumentOutline outline = new PDDocumentOutline();
PDOutlineItem root = new PDOutlineItem();
root.setTitle("Root");
PDOutlineItem child1 = new PDOutlineItem();
child1.setTitle("child1");
root.appendChild(child1);
outline.appendChild(root);
{code}
This will have negative COUNT in the outline dictionary. The thing is that
current implementation creates closed PDOutlineNode by default and applies
table 153 COUNT logic to both PDOutlineItem and PDDocumentOutline so basically
it treats PDDocumentOutline as a closed _outline item_ which as you said can be
negative.
> Negative Outlines COUNT and various issues
> ------------------------------------------
>
> Key: PDFBOX-2677
> URL: https://issues.apache.org/jira/browse/PDFBOX-2677
> Project: PDFBox
> Issue Type: Bug
> Components: PDModel
> Affects Versions: 2.0.0
> Environment: 2.0.0-SNAPSHOT r1658566
> Reporter: Andrea Vacondio
> Labels: outline
> Fix For: 2.0.0
>
> Attachments: outline_closed_negative_outlines_count_wrong_last.pdf,
> outline_closed_patched.pdf, outline_patch.diff,
> outline_wrong_first_has_prev.pdf
>
>
> Hi,
> I started playing with the outline package few days ago mostly writing unit
> tests but I found the current implementation has a number of issues and
> started fixing them. I ended up with a quite substantial patch I'm going to
> attach.
> So far I only addressed the addition of nodes.
> Current implementation suffers of some issues:
> * insertSiblingAfter doesn't set the LAST on its parent in case it's the last
> node
> * Outlines COUNT can be negative (and often is) despite the spec table 152
> states "The value cannot be negative."
> * invalid outline hierarchy with wrong COUNT can be created with no warning
> with code like:
> {code:java}
> PDDocumentOutline outline = new PDDocumentOutline();
> PDOutlineItem root = new PDOutlineItem();
> root.setTitle("Root");
> PDOutlineItem child1 = new PDOutlineItem();
> child1.setTitle("child1");
> PDOutlineItem child11 = new PDOutlineItem();
> child11.setTitle("child11");
> PDOutlineItem child12 = new PDOutlineItem();
> child12.setTitle("child12");
> PDOutlineItem child13 = new PDOutlineItem();
> child13.setTitle("child13");
> child11.insertSiblingAfter(child12);
> child12.insertSiblingAfter(child13);
> child1.appendChild(child12);
> root.appendChild(child1);
> outline.appendChild(root);
> {code}
> I'm going to attach a couple of generated pdf showing the mentioned issues.
> The patch addresses:
> * PDFBOX-156
> * PDFBOX-996
> * PDFBOX-1209
> * Outlines COUNT is always positive (table 152 "Total number of visible
> outline items at all levels of the outline")
> * Outline items COUNT is correctly calculated
> * NEXT, PREV, LAST and FIRST are are consistently set
> * unit tested
> I added a restriction to methods adding nodes (children or siblings) that
> throws an exception in case the node is already part of a list (i.e it has a
> prev or a next) so basically with the patch you cannot create a list of nodes
> and then add one of them as last child of another node but you'll have to
> first add the first child and then add siblings to the child.
> Those scenarios are currently silently accepted creating invalid outlines
> (see the attached outline_wrong_first_has_prev.pdf) and would require quite
> some work to handle all of them so, I'm not sure it's the best solution but
> at least the user is guided with a message instead of creating an outline
> where the FIRST item has a PREV.
> It breaks the current API and it might be reworked to be less intrusive but
> since you are on 2.0.0-SNAPSHOT I thought it was ok.
> Please let me know if there's anything I can help with.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]