Skip to content

Thread is stuck during HTML to PDF conversion with nested tables for fairly large HTML #551

Closed
@swillis12

Description

@swillis12

Update 9/23/20: The first two HTML files I attached are misleading and work as expected. I found that the problem is actually occurring only when the height/max-height of the div enclosing the table is set to "auto":
image

@syjer Try this new HTML file attached, it should reproduce the issue for you as well. Sorry about the confusion with the previous test cases. FYI running this in my minimal test application using this HTML file was 90,087ms which is consistent with the results I see inside of my program.
smaller_test_auto_height.txt

Original Issue/info below, the stack trace thread dump info applies to the "smaller_test_auto_height.txt" test case since my proram was using this "auto" height all along (which I wasn't aware of 🤦 ):

Currently our HTML target is email, so we are using a lot of HTML table elements, nested and everything is inline styles. I suspect that I have a thread hanging due to the nested tables. Unfortunately I'm not sure what I can do to work around this issue. I've tried "table-layout: fixed" and assigning column widths as well.

Update: made sure that it is valid XHTML as well using https://validator.w3.org/: problem_html1.txt

Here is also a smaller test html that is still painfully slow (~1.5-2 minutes). It is the same content, just reduced the number of table rows to 71 for easier visibility:
smaller_test.txt

If I enable logging I see infinite messages as follow:

com.openhtmltopdf.cascade FINEST:: min-height, relative= 0.0 (0), absolute= 0.0 using base=460.0
com.openhtmltopdf.cascade FINEST:: text-indent, relative= 0.0 (0), absolute= 0.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: min-width, relative= 0.0 (0), absolute= 0.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: min-width, relative= 0.0 (0), absolute= 0.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: height, relative= 23.0 (23px), absolute= 460.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: min-height, relative= 0.0 (0), absolute= 0.0 using base=460.0
com.openhtmltopdf.cascade FINEST:: text-indent, relative= 0.0 (0), absolute= 0.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: min-width, relative= 0.0 (0), absolute= 0.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: min-width, relative= 0.0 (0), absolute= 0.0 using base=0.0
com.openhtmltopdf.cascade FINEST:: height, relative= 23.0 (23px), absolute= 460.0 using base=0.0

Thread dump shows this stack:

"http-bio-8080-exec-10" #204 daemon prio=5 os_prio=31 tid=0x00007fa152c59000 nid=0x13803 runnable [0x0000700014582000]
   java.lang.Thread.State: RUNNABLE
        at org.apache.juli.ClassLoaderLogManager.getLogger(ClassLoaderLogManager.java:229)
        - locked <0x00000006c01af2f0> (a org.apache.juli.ClassLoaderLogManager)
        at java.util.logging.LogManager.demandLogger(LogManager.java:551)
        at java.util.logging.Logger.demandLogger(Logger.java:455)
        at java.util.logging.Logger.getLogger(Logger.java:502)
        at com.openhtmltopdf.util.JDKXRLogger.getLogger(JDKXRLogger.java:103)
        at com.openhtmltopdf.util.JDKXRLogger.isLogLevelEnabled(JDKXRLogger.java:75)
        at com.openhtmltopdf.util.XRLog.log(XRLog.java:122)
        at com.openhtmltopdf.util.XRLog.log(XRLog.java:113)
        at com.openhtmltopdf.css.style.derived.LengthValue.calcFloatProportionalValue(LengthValue.java:204)
        at com.openhtmltopdf.css.style.derived.LengthValue.getFloatProportionalTo(LengthValue.java:80)
        at com.openhtmltopdf.css.style.CalculatedStyle.getFloatPropertyProportionalTo(CalculatedStyle.java:437)
        at com.openhtmltopdf.css.style.CalculatedStyle.getMinHeight(CalculatedStyle.java:1174)
        at com.openhtmltopdf.render.BlockBox.getCSSMinHeight(BlockBox.java:1628)
        at com.openhtmltopdf.render.BlockBox.applyCSSMinMaxHeight(BlockBox.java:1172)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1074)
        at com.openhtmltopdf.newtable.TableRowBox.layoutCell(TableRowBox.java:452)
        at com.openhtmltopdf.newtable.TableRowBox.layoutChildren(TableRowBox.java:206)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layout(TableRowBox.java:95)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableSectionBox.layoutChildren(TableSectionBox.java:137)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableSectionBox.layout(TableSectionBox.java:278)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableBox.layoutChildren(TableBox.java:319)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.newtable.TableBox.layoutTable(TableBox.java:284)
        at com.openhtmltopdf.newtable.TableBox.layout(TableBox.java:243)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:109)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:109)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layoutCell(TableRowBox.java:452)
        at com.openhtmltopdf.newtable.TableRowBox.layoutChildren(TableRowBox.java:206)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layout(TableRowBox.java:95)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableSectionBox.layoutChildren(TableSectionBox.java:137)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableSectionBox.layout(TableSectionBox.java:278)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableBox.layoutChildren(TableBox.java:319)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.newtable.TableBox.layoutTable(TableBox.java:284)
        at com.openhtmltopdf.newtable.TableBox.layout(TableBox.java:243)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layoutCell(TableRowBox.java:452)
        at com.openhtmltopdf.newtable.TableRowBox.layoutChildren(TableRowBox.java:206)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layout(TableRowBox.java:95)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableSectionBox.layoutChildren(TableSectionBox.java:137)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableSectionBox.layout(TableSectionBox.java:278)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:109)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableBox.layoutChildren(TableBox.java:319)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.newtable.TableBox.layoutTable(TableBox.java:284)
        at com.openhtmltopdf.newtable.TableBox.layout(TableBox.java:243)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:109)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layoutCell(TableRowBox.java:452)
        at com.openhtmltopdf.newtable.TableRowBox.layoutChildren(TableRowBox.java:206)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layout(TableRowBox.java:95)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:109)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableSectionBox.layoutChildren(TableSectionBox.java:137)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableSectionBox.layout(TableSectionBox.java:278)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableBox.layoutChildren(TableBox.java:319)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.newtable.TableBox.layoutTable(TableBox.java:284)
        at com.openhtmltopdf.newtable.TableBox.layout(TableBox.java:243)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layoutCell(TableRowBox.java:452)
        at com.openhtmltopdf.newtable.TableRowBox.layoutChildren(TableRowBox.java:206)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layout(TableRowBox.java:95)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableSectionBox.layoutChildren(TableSectionBox.java:137)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableSectionBox.layout(TableSectionBox.java:278)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:103)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableBox.layoutChildren(TableBox.java:319)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.newtable.TableBox.layoutTable(TableBox.java:284)
        at com.openhtmltopdf.newtable.TableBox.layout(TableBox.java:243)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layoutCell(TableRowBox.java:452)
        at com.openhtmltopdf.newtable.TableRowBox.layoutChildren(TableRowBox.java:206)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableRowBox.layout(TableRowBox.java:95)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableSectionBox.layoutChildren(TableSectionBox.java:137)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.newtable.TableSectionBox.layout(TableSectionBox.java:278)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.newtable.TableBox.layoutChildren(TableBox.java:319)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.newtable.TableBox.layoutTable(TableBox.java:284)
        at com.openhtmltopdf.newtable.TableBox.layout(TableBox.java:243)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild0(BlockBoxing.java:321)
        at com.openhtmltopdf.layout.BlockBoxing.layoutBlockChild(BlockBoxing.java:299)
        at com.openhtmltopdf.layout.BlockBoxing.layoutContent(BlockBoxing.java:90)
        at com.openhtmltopdf.render.BlockBox.layoutChildren(BlockBox.java:1204)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:1058)
        at com.openhtmltopdf.render.BlockBox.layout(BlockBox.java:973)
        at com.openhtmltopdf.pdfboxout.PdfBoxRenderer.layout(PdfBoxRenderer.java:344)
        at com.openhtmltopdf.pdfboxout.PdfRendererBuilder.run(PdfRendererBuilder.java:41)
...

Question is -- what exactly is the issue and what can I do to work around this if I am pretty much stuck with the current layout? It may not be feasible to get rid of the table nesting.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions