[reportlab-users] Re: Broken PDFs with multiBuild and file objects

Robin Becker reportlab-users@reportlab.com
Mon, 6 Jan 2003 11:15:13 +0000


Andy says

> PDF isn't a sequential format, at least not the simple way we
> do it, so you need the whole object tree in memory. We could
> add some new APIs so that the primary, preferred way is to make
> a PDF in memory, and the existing behaviour builds simply on
> this to save to a filename if given.

I'm not sure I understand the relevance here. The PDF is currently
always assembled in memory (in a list) and we then write that only right
at the end. I believe the correct way to handle this for multi-build is
to separate out the build part from the save part. This is what I
attempted to do for rml2pdf.

That required a specialisation of the BaseDocTemplate class to allow for
a different _endBuild.

eg      def _endBuild(self):
                if self._hanging!=[] and self._hanging[-1] is PageBegin:
                        del self._hanging[-1]
                        self.clean_hanging()
                else:
                        self.clean_hanging()
                        self.handle_pageBreak()

                if getattr(self,'_doSave',1): self.canv.save()
                if self._onPage: self.canv.setPageCallBack(None)

this was incorporated in the standard sometime ago and I should have
used it instead of my temprary hack.

then in the standard thing we always save. The multiBuild methods can
then set self._doSave = 0, and iterate till completion.

The real fix then does

        self._doSave = 0
        while 1:
                .......
                happy = self._allSatisfied()

                if happy:
                        self._doSave = 0
                        self.canv.save()
                        break

-- 
Robin Becker