[reportlab-users] Header appears mid-page due to splitByRow/splitInRow interaction

Robin Becker robin at reportlab.com
Wed Nov 26 04:30:57 EST 2025


Hi Yoshua,

I tried your patch and it does work, but I think it's better to use
[part1,  UseUpSPace(), part2}  instead of  [part1,  PageBreak(), part2}.

I will visually try the modified code against all the tests.

On Tue, 25 Nov 2025 at 12:50, Robin Becker <robin at reportlab.com> wrote:

> Hi Yoshua,
>
> you really like splitting rows. It's something of a problem for reportlab
> as it's just grafted on to the old table code and much harder than the non
> row splitting case.
>
> Clearly finding a suitable split point across multiple columns is harrer
> than splitting by rows.
>
> Assuming that the problem is that a row split may leave space behind I
> guess that the problem is that we should just fill that space and leave the
> layout to the higher levels.
>
> Certainly just using a PageBreak is not right as it will cause problems
> for the higher level eg we might want a frame break or be inside one of the
> other container layouts.
>
> I'll take a look at the example and see if the fix can just use up the
> space.
>
> Thanks for the contribution . If only we had infinitely  long pages :(
>
>
>
> On Mon, 24 Nov 2025 at 22:53, Yoshua Wakeham via reportlab-users <
> reportlab-users at lists2.reportlab.com> wrote:
>
>> Hello,
>>
>> I've found a bug in table-splitting code that can occur when all of
>> `splitByRow`, `splitInRow`, and `repeatRows` are non-zero. Namely, a
>> between-row split immediately followed by a within-row split can cause
>> header/repeated rows to be drawn in the middle of a page/frame.
>> Suppose a table T is too tall to fit in a frame, so `T.split()` is
>> called. When `splitByRow=1` and `splitInRow>1`, we attempt a between-row
>> split before checking whether a within-row split would have succeeded.
>> Suppose the between-row split succeeds, splitting the table into T1 and T2.
>>
>> Notably, the repeated rows specified by `repeatRows` will then be
>> inserted at the start of T2, before `T.split()` returns `[T1, T2]`.
>>
>> It seems that reportlab then tries to fit T2 into the space that remains
>> in the frame after T1 is accounted for. Since we know the first row of T2
>> is too big to fit in that space, the between-row split fails, and instead
>> we try a within-row split. If that succeeds, it exposes the bug – because
>> the repeated header rows will be drawn in the middle of the frame, along
>> with the top half of the newly-split row!
>>
>> I've confirmed this is reproducible in version 4.4.4.
>>
>> I'm attaching a minimal reproducible example. The output frames look like
>> this on v4.4.4:
>> [image: CleanShot 2025-11-13 at 14.24.08 at 2x.jpg]
>> [image: CleanShot 2025-11-13 at 14.24.21 at 2x.jpg]
>>
>> I'm not sure how best to fix this, but for the sake of argument, I've
>> attached a patch that simply inserts a `PageBreak()` between the two
>> returned tables (as long as the successful split was between rows). That
>> ensures that the between-row split has the intended effect, and no content
>> can "sneak" back onto the page. With my patch applied, the output looks
>> like what we would expect:
>>
>> [image: CleanShot 2025-11-13 at 14.29.58 at 2x.jpg]
>> [image: CleanShot 2025-11-13 at 14.30.11 at 2x.jpg]
>> If there's another approach that would make more sense, I'd be happy to
>> put time into fixing this.
>>
>> Thanks so much!
>> Yosh
>>
>> --
>> *Yoshua Wakeham*
>> Senior Software Developer
>> yosh at atticus.tech
>> _______________________________________________
>> reportlab-users mailing list
>> reportlab-users at lists2.reportlab.com
>> https://pairlist2.pair.net/mailman/listinfo/reportlab-users
>>
>
>
> --
> Robin Becker
>


-- 
Robin Becker
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20251126/44e85ead/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CleanShot 2025-11-13 at 14.24.08 at 2x.jpg
Type: image/jpeg
Size: 19443 bytes
Desc: not available
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20251126/44e85ead/attachment-0004.jpg>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CleanShot 2025-11-13 at 14.24.21 at 2x.jpg
Type: image/jpeg
Size: 16124 bytes
Desc: not available
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20251126/44e85ead/attachment-0005.jpg>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CleanShot 2025-11-13 at 14.29.58 at 2x.jpg
Type: image/jpeg
Size: 16179 bytes
Desc: not available
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20251126/44e85ead/attachment-0006.jpg>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CleanShot 2025-11-13 at 14.30.11 at 2x.jpg
Type: image/jpeg
Size: 16560 bytes
Desc: not available
URL: <https://pairlist2.pair.net/pipermail/reportlab-users/attachments/20251126/44e85ead/attachment-0007.jpg>


More information about the reportlab-users mailing list