[reportlab-users] Error using ImageAndFlowables
Robin Becker
robin at reportlab.com
Wed May 16 03:50:29 EDT 2018
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.
>
More information about the reportlab-users
mailing list