Re: Error using ImageAndFlowables

Robin Becker <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
Hi Lele,

thanks for the report. Unfortunately I have been ill last couple of weeks so have not had time to look at this.

I don't think you are abusing ImageAndFlowables.

List objects were introduced after ImageAndFlowables and I suspect the problem is in the list splitting not working properly for 
this case.

I will take a look as time permits.
-- 
Robin Becker


On 30/04/2018 23:06, Lele Gaifax wrote:
> Hi all,
> 
> one of my apps builds a PDF with a slightly dynamic layout. One part uses an
> ImageAndFlowables, where the size of the image as well as the flowables are
> controlled by the end user.
> 
> At some point it started to crash with a "strange" traceback, and I spent a
> few hours trying to understand the reason, until I found it and distilled the
> little script I'm attaching below.
> 
> The problem happens when the flowables include a List *and* the image is big
> enough to "include" the List (sorry, I find it difficult to explain better
> than that): in other words, if the image is "little" so that on its right
> there are only Paragraphs it works, but as soon its height is enough to
> "reach" the List, it breaks.
> 
> The following script demonstrates the issue: it builds two documents, one with
> a tiny image, the second with a slightly bigger one, that gives this
> traceback (slightly edited to reduce overly long lines):
> 
>      $ python test_image.py
>      Created sample1.pdf
>      Traceback (most recent call last):
>        File "test_image.py", line 39, in <module>
>          doc.build([ImageAndFlowables(Image('pythonpowered.gif', 30, 30), elts, imageSide='left')])
>        File ".../python3.6/site-packages/reportlab/platypus/doctemplate.py", line 1213, in build
>          BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker)
>        File ".../python3.6/site-packages/reportlab/platypus/doctemplate.py", line 969, in build
>          self.handle_flowable(flowables)
>        File ".../python3.6/site-packages/reportlab/platypus/doctemplate.py", line 834, in handle_flowable
>          if frame.add(f, canv, trySplit=self.allowSplitting):
>        File ".../python3.6/site-packages/reportlab/platypus/frames.py", line 167, in _add
>          w, h = flowable.wrap(aW, h)
>        File ".../python3.6/site-packages/reportlab/platypus/flowables.py", line 1244, in wrap
>          W,H0,self._C0,self._C1 = self._findSplit(canv,iW,aH)
>        File ".../python3.6/site-packages/reportlab/platypus/flowables.py", line 1336, in _findSplit
>          S = cdeepcopy(f).splitOn(canv,availWidth,aH)
>        File ".../python3.6/site-packages/reportlab/platypus/flowables.py", line 881, in cdeepcopy
>          return deepcopy(obj)
>        File "/usr/lib/python3.6/copy.py", line 180, in deepcopy
>          y = _reconstruct(x, memo, *rv)
>        File "/usr/lib/python3.6/copy.py", line 280, in _reconstruct
>          state = deepcopy(state, memo)
>        File "/usr/lib/python3.6/copy.py", line 150, in deepcopy
>          y = copier(x, memo)
>        File "/usr/lib/python3.6/copy.py", line 240, in _deepcopy_dict
>          y[deepcopy(key, memo)] = deepcopy(value, memo)
>        File "/usr/lib/python3.6/copy.py", line 150, in deepcopy
>          y = copier(x, memo)
>        File "/usr/lib/python3.6/copy.py", line 215, in _deepcopy_list
>          append(deepcopy(a, memo))
>        File "/usr/lib/python3.6/copy.py", line 180, in deepcopy
>          y = _reconstruct(x, memo, *rv)
>        File "/usr/lib/python3.6/copy.py", line 281, in _reconstruct
>          if hasattr(y, '__setstate__'):
>        File ".../python3.6/site-packages/reportlab/platypus/flowables.py", line 1561, in __getattr__
>          return getattr(self._flowable,a)
>        File ".../python3.6/site-packages/reportlab/platypus/flowables.py", line 1557, in __getattr__
>          return self.__dict__[a]
>      KeyError: '_flowable'
> 
> This is the sample script:
> 
>      from reportlab.lib.pagesizes import A4
>      from reportlab.platypus import ListFlowable, ListItem, Paragraph
>      from reportlab.platypus import ImageAndFlowables, SimpleDocTemplate, Image
>      from reportlab.lib.styles import getSampleStyleSheet
> 
>      styles = getSampleStyleSheet()
> 
>      doc = SimpleDocTemplate("sample1.pdf", pagesize=A4,
>                              rightMargin=72, leftMargin=72,
>                              topMargin=72, bottomMargin=18)
> 
>      elts = [Paragraph("a adfj kjh kj hkjh k", styles['Normal']),
>              Paragraph("a adfj kjh kj hkjh k", styles['Normal']),
>              ListFlowable([
>                  ListItem(Paragraph("a", styles['Normal'])),
>                  ListItem(Paragraph("b", styles['Normal'])),
>                  ListItem(Paragraph("c", styles['Normal'])),
>                  ListItem(Paragraph("d", styles['Normal'])),
>                  ListItem(Paragraph("e", styles['Normal'])),
>              ], style=styles['ul'])]
> 
>      doc.build([ImageAndFlowables(Image('pythonpowered.gif', 20, 20), elts, imageSide='left')])
>      print("Created sample1.pdf")
> 
>      doc = SimpleDocTemplate("sample2.pdf", pagesize=A4,
>                              rightMargin=72, leftMargin=72,
>                              topMargin=72, bottomMargin=18)
> 
>      elts = [Paragraph("a adfj kjh kj hkjh k", styles['Normal']),
>              Paragraph("a adfj kjh kj hkjh k", styles['Normal']),
>              ListFlowable([
>                  ListItem(Paragraph("a", styles['Normal'])),
>                  ListItem(Paragraph("b", styles['Normal'])),
>                  ListItem(Paragraph("c", styles['Normal'])),
>                  ListItem(Paragraph("d", styles['Normal'])),
>                  ListItem(Paragraph("e", styles['Normal'])),
>              ], style=styles['ul'])]
> 
>      doc.build([ImageAndFlowables(Image('pythonpowered.gif', 30, 30), elts, imageSide='left')])
>      print("Created sample2.pdf")
> 
> Am I abusing the ImageAndFlowables here?
> 
> Thanks in advance for any hint,
> ciao, lele.
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.