[ https://issues.apache.org/jira/browse/PDFBOX-6036?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18008208#comment-18008208 ]
Andreas Lehmkühler commented on PDFBOX-6036: -------------------------------------------- Is this based on a real use case or a constructed one? I'd like to evaluate the real severity of this "bootleneck" to see if we had to find a quick and maybe dirty solution > StackOverflowError in COSWriterCompressionPool for large number of bookmarks > ---------------------------------------------------------------------------- > > Key: PDFBOX-6036 > URL: https://issues.apache.org/jira/browse/PDFBOX-6036 > Project: PDFBox > Issue Type: Bug > Affects Versions: 3.0.5 PDFBox > Reporter: Bernhard Fey > Priority: Critical > > Saving a document containing thousands of bookmarks causes a > {{StackOverflowError}} in {{{}COSWriterCompressionPool{}}}. > > The stack trace alternates between the following two methods: > > > {code:java} > at > org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addStructure(COSWriterCompressionPool.java:190) > at > org.apache.pdfbox.pdfwriter.compress.COSWriterCompressionPool.addElements(COSWriterCompressionPool.java:204) > {code} > > > You can replicate the issue with the following class: > > > {code:java} > public class StackOverflBookm { > public static void main(String[] args) { > for (int i = 1; i <= 1_111_111; i *= 2) { > System.out.println(new > java.text.DecimalFormat("#,###").format(i)); > try (org.apache.pdfbox.pdmodel.PDDocument document = new > org.apache.pdfbox.pdmodel.PDDocument()) { > > org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline > outline = > new > org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline(); > > document.getDocumentCatalog().setDocumentOutline(outline); > for (int j = 0; j < i; j++) { > outline.addLast(new > org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem()); > } > document.save(new java.io.ByteArrayOutputStream(), > > org.apache.pdfbox.pdfwriter.compress.CompressParameters.DEFAULT_COMPRESSION); > // NO_COMPRESSION avoids the Error > } catch (Throwable e) { > e.printStackTrace(System.out); > return; > } > } > } > }{code} > > > Without compression it will create documents with up to over a million > bookmarks (assuming sufficient heap size, 1 gigabyte is enough). > But with the default compression the StackOverflowError will be thrown (on my > Windows VMs, with a default stack size of about 1 megabyte, before reaching > ten thousand bookmarks). > > Apparently the recursion depth of the two methods grows with the amount of > bookmarks, until the Error is thrown. > > I have chosen the priority Critical, because an {{Error}} is thrown and, > unlike Exceptions, likely not handled in integrations. > Additionally, most integrations likely use the {{save}} methods without the > second parameter, getting compression enabled by default. -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org For additional commands, e-mail: dev-h...@pdfbox.apache.org