[reportlab-users] Miscalculation when using keepWithNext
Pierre Ossman
ossman at cendio.se
Thu Nov 4 03:22:14 EDT 2021
Hi,
We've run in to an issue with ReportLab where it can orphan a heading
under some circumstances, despite things being correctly marked with
keepWithNext.
After some digging we found that flowables._listWrapOn() does not
compute the same height as Frame._add(). So what happens is that
KeepTogether things the flowables will all fit, but once the Frame
starts adding things the last element gets punted to the next page.
I'm afraid I don't have an easy example for you, but I do have some
numbers that should allow anyone to go through the code.
We have the following elements that are all marked keepWithNext:
Width Height Space Before Space After
--------------------------------------------
0 3 0 0
470 15 12 6
470 36 6 0
The frame is at y=67. The space required for the above elements is
3+12+15+6+36=72. I.e. it won't fit. However _listWrapOn() computes a
required height of 57 here, so it thinks things will fit.
There are two bugs in play here:
a) _listWrapOn() ignores things with 0 width, however Frame._add() does
not. So the first element gets discarded, dropping 3 from the resulting
height.
b) _listWrapOn() assumes it is at the top of a frame, and should
therefore discard the first flowable's spaceBefore. This seems unsafe as
it will then often underestimate the space required. It would likely be
better to assume it is never at the top and hence overestimate. This bug
then acts on the second flowable (since the first was dropped), dropping
another 12 from the total height.
And 72 - 12 - 3 = 57, and we get the bogus height number.
For now I've worked around this by making sure that initial flowable is
1×3 instead of 0×3.
I also noticed that KeepTogether._H0 is probably incorrect since it
doesn't include spaceBefore. But that might be tied to the assumption of
always being at the top of a frame.
Regards
--
Pierre Ossman Software Development
Cendio AB https://cendio.com
Teknikringen 8 https://twitter.com/ThinLinc
583 30 Linköping https://facebook.com/ThinLinc
Phone: +46-13-214600
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
More information about the reportlab-users
mailing list