最起码的例子:
import io
import lorem
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph
styles = getSampleStyleSheet()
story = [Paragraph(lorem.text(), styles["Normal"])]
with io.BytesIO() as out:
doc = SimpleDocTemplate(out)
doc.build(story) # here, you can replace story with story[:] to fix it
with open("test.pdf", "wb+") as out:
doc = SimpleDocTemplate(out)
doc.build(story[:])上面的代码生成一个空PDF文件(960字节,没有内容,空白页面)。如果将第一个( build(story) )块中的build(story[:])替换为build(story[:]),则在第二个(open文件)块中正确生成test.pdf文件。
为什么?
(WindowsPython3.9.0 amd64,reportlab 3.5.65)
发布于 2022-03-14 08:14:57
答案是这个故事被doc.build消耗掉了。当您构建一个文档时,内部对象会在您的故事中被更改,并且它们不能被重用来扩展另一个文档。我想它在任何地方都没有记录。仅使用浅拷贝是不够的,它很可能最终会出现“可流动太大”的reportlab.platypus.doctemplate.LayoutError错误。
当您想要多次呈现一个故事时,最安全的解决方案是始终使用深拷贝:
import copy
doc.build(copy.deepcopy(story))https://stackoverflow.com/questions/71458904
复制相似问题