Unfortunately, the reportlab-users mailing list is unavailable (I cannot subscribe). There is paid support but since I already have a workaround, I won't pay for this. I think this is a documentation error of the reportlab package. (They do not mention that stories cannot be reused.)
I think we can say that my original problem is solved, because I have a workaround that always works. Schachner, Joseph <joseph.schach...@teledyne.com> ezt írta (időpont: 2022. márc. 14., H 19:09): > I realize this is Python code, but I doubt that the question is a Python > question. I have used Python +numpy, scipy, matplotlib for years. I have > not used reportlab and have no idea about the reported problem except that > I will be very surprised if it turns out to be a Python language issue. > Is there possibly a better place to ask this question? > > > Teledyne Confidential; Commercially Sensitive Business Data > > -----Original Message----- > From: Les <nagy...@gmail.com> > Sent: Sunday, March 13, 2022 4:56 PM > To: python-list@python.org > Subject: Reportlab / platypus bug? > > Hello, > > I have found an error, and I created a minimal working example. The > minimal working example starts with the very first example from Platypus > user guide: > > from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer from > reportlab.lib.styles import getSampleStyleSheet from > reportlab.lib.pagesizes import A4 from reportlab.lib.units import inch > > PAGE_HEIGHT = A4[1] > PAGE_WIDTH = A4[0] > styles = getSampleStyleSheet() > > Title = "Hello world" > pageinfo = "platypus example" > > > def myFirstPage(canvas, doc): > canvas.saveState() > canvas.setFont('Times-Bold', 16) > canvas.drawCentredString(PAGE_WIDTH / 2.0, PAGE_HEIGHT - 108, Title) > canvas.setFont('Times-Roman', 9) > canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo) > canvas.restoreState() > > > def myLaterPages(canvas, doc): > canvas.saveState() > canvas.setFont('Times-Roman', 9) > canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, > pageinfo)) > canvas.restoreState() > > > def go(): > Story = [Spacer(1, 2 * inch)] > style = styles["Normal"] > for i in range(100): > bogustext = ("This is Paragraph number %s. " % i) * 20 > p = Paragraph(bogustext, style) > Story.append(p) > Story.append(Spacer(1, 0.2 * inch)) > doc = SimpleDocTemplate("phello.pdf") > doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages) > > > go() > > > If I change it to this (e.g. generate two identical files): > > doc = SimpleDocTemplate("phello.pdf") > doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages) doc = > SimpleDocTemplate("phello2.pdf") doc.build(Story, onFirstPage=myFirstPage, > onLaterPages=myLaterPages) > > > then it builds phello.pdf correctly, but builds a totally empty phello2.pdf > (960 bytes, a single white empty page). > > It is hard to explain as it is, but something even more interesting > happens if you try to make them totally independent, and create a copy of > the story as well: > > import copy > doc = SimpleDocTemplate("phello.pdf") > doc.build(copy.copy(Story), onFirstPage=myFirstPage, > onLaterPages=myLaterPages) doc = SimpleDocTemplate("phello2.pdf") > doc.build(copy.copy(Story), onFirstPage=myFirstPage, > onLaterPages=myLaterPages) > > > This will render phello.pdf correctly, and it will throw this error when > rendering phello2.pdf: > > Traceback (most recent call last): > File "C:\Projects\test\test2.py", line 48, in <module> > go() > File "C:\Projects\test\test2.py", line 45, in go > doc.build(copy.copy(Story), onFirstPage=myFirstPage, > onLaterPages=myLaterPages) > File > > "C:\Users\nagyl\.virtualenvs\test-NC9-O-tN\lib\site-packages\reportlab\platypus\doctemplate.py", > line 1314, in build > BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker) > File "C:\Users\nagyl\.virtualenvs\ > test-NC9-O-tN\lib\site-packages\reportlab\platypus\doctemplate.py", line > 1079, in build > self.handle_flowable(flowables) > File "C:\Users\nagyl\.virtualenvs\ > test-NC9-O-tN\lib\site-packages\reportlab\platypus\doctemplate.py", line > 958, in handle_flowable > raise LayoutError(ident) > reportlab.platypus.doctemplate.LayoutError: Flowable <Paragraph at > 0x148e102cb80 frame=normal>This is Paragraph number 6. This is Paragraph > number 6. This(439.27559055118115 x 72) too large on page 1 in frame > 'normal'(439.27559055118115 x 685.8897637795277) of template 'First' > > And finally, here is the "solution" that solves all problems: > > > def go(): > def create_story(): > Story = [Spacer(1, 2 * inch)] > style = styles["Normal"] > for i in range(100): > bogustext = ("This is Paragraph number %s. " % i) * 20 > p = Paragraph(bogustext, style) > Story.append(p) > Story.append(Spacer(1, 0.2 * inch)) > return Story > > doc = SimpleDocTemplate("phello.pdf") > doc.build(create_story(), onFirstPage=myFirstPage, > onLaterPages=myLaterPages) > doc = SimpleDocTemplate("phello2.pdf") > doc.build(create_story(), onFirstPage=myFirstPage, > onLaterPages=myLaterPages) > > > This does not throw an error, and it renders both files correctly. But I > do not see why this last version works, and the previous one (that uses > copy.copy) does not. > > I was looking for an explanation in the user guide. I was looking for a > note, telling me that a story can be used for document generation only > once. But there is no such thing in the docs. Or maybe I just did not find > it. Can somebody please explain what is happening here? > > Environment details: Python 3.10.1 amd64 on Windows, reportlab 3.6.6 > > Thanks, > > Laszlo > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list