I have been working with some complex PDF outputs with reportlab. These are generally fine but there are some cases still where I get LayoutErrors – these are usually because Flowables are too big at some point.
It’s proving o be pretty hard to debug these as I don’t often have more information than something like this;
Flowable <Table@0x104C32290 4 rows x 6 cols> with cell(0,0) containing
'<Paragraph at 0x104df2ea8>Authors'(789.0 x 1176) too large on page 5 in frame 'normal'(801.543307087 x 526.582677165*) of template 'Later'
It’s really not that helpful. What I would ideally like to know is the best debugging and testing strategies for this kinda thing.
- Is there a way I can view a broken PDF? i.e. rendered with the layout errors so I can see whats going on more easily.
- Is there a way I can add a hook to reportlab to better handle these errors? Rather than just failing the whole PDF?
- Any other suggestions about generally improving, testing and handling problems like these.
I don’t have a particular example so its more general advice, the exception above I have resolved but its kinda through trial and error (read; guessing and seeing what happens).
We had a problem when using Reportlab to format some content that was originally html and sometimes the html was too complex. The solution (and I take no credit here, this was from the guys at Reportlab) was to catch the error when it occurred and output it directly into the PDF.
That means you get to see the cause of the problem in the right context. You could expand on this to output details of the exception, but in our case since our problem was converting html to rml we just had to display our input:
Tthe preppy template contains this:
and then later bits of template like:
In rml_helpers.py we have:
So anything which is too complex for
xhtml2rmlto handle throws an exception and is replaced in the output by a big warning ‘Could not process markup’ followed by the markup that caused the error, escaped so it appears as literal.Then all we have to do is to remember to search the output PDF for the error message and fix up the input accordingly.