[reportlab-users] Crashing when table goes over a page
Robin Becker
reportlab-users@reportlab.com
Tue, 29 Jul 2003 09:16:50 +0100
In article <$2BOKIAWtiJ$EwI6@jessikat.fsnet.co.uk>, Robin Becker
<robin@reportlab.com> writes
>In article <002501c3556e$3b076610$8a01010a@gkiddxp2>, Garth Kidd <garth@deadlybl
>oodyserious.com>
>writes
>>Further to my last mail; today's report run doesn't trigger the problem, so
>>I've got a new one. :)
>>
>>After a few inches' content, my story has a KeepTogether of a header, space,
>>long table, and then another space. The table is longer than a page. What I
>>want to happen is for the header, space, and first part of the table to
>>appear in the remaining 4/5 of the first page, continuing on the second.
>>Instead the table doesn't start until page 2 (leaving a lot of empty space),
>>fills page 2, and then continues on page 3.
>>
>>When I specify a KeepTogether, what I want is for Platypus to ensure that
>>each item starts adjacent to the end of the previous item. That aside, I
>>want to fill pages as much as is possible.
>>
>>Anyone have any ideas on a quick fix? I'd really much rather be
>>concentrating on advanced graphing than fixing basic document flow
>>functionality.
>>
>>Regards,
>>Garth.
>The keep together tries to do what you want, unfortunately it doesn't know the
>total frame
>height when attempting to split itself. If it did it could perform the split
>more rationally.
>Without that information it can only attempt to get the most space for itself.
>
>We could make a more acceptable keepTogether by giving it an extra argument
>specifying the frame
>height to be assumed for simple (non-page throw splitting).
>
>This isn't tested so be careful.
>
>class KeepTogether(Flowable):
> def __init__(self,flowables,maxHeight=None):
> if type(flowables) not in _SeqTypes:
> self._flowables = [flowables]
> else:
> self._flowables = flowables
> self._maxHeight = maxHeight
>
> def __repr__(self):
> f = self._flowables
> L = map(repr,f)
> import string
> L = "\n"+string.join(L, "\n")
> L = string.replace(L, "\n", "\n ")
> return "KeepTogether(%s,maxHeight=%s) # end KeepTogether" %
>(L,self._maxHeight)
>
> def wrap(self, aW, aH):
> W = 0
> H = 0
> F = self._flowables
> canv = self.canv
> for f in F:
> w,h = f.wrapOn(canv,aW,0xfffffff)
> if f is not F[0]: h = h + f.getSpaceBefore()
> if f is not F[-1]: h = h + f.getSpaceAfter()
> W = max(W,w)
> H = H+h
> self._CPage = (H>aH) and (H<=self._maxHeight)
this should be
self._CPage = (H>aH) and (not self._maxHeight or
H<=self._maxHeight)
> return W, 0xffffff # force a split
>
> def split(self, aW, aH):
> S = getattr(self,'_CPage',1) and [CondPageBreak(aH+1)] or []
> for f in self._flowables: S.append(f)
> return S
>
--
Robin Becker