Reportlab双栏输出为何自动切换为单栏?技术求助
解决Reportlab生成PDF时后续页面从双栏变为单栏的问题
我来帮你分析这个问题的根源,以及给出彻底的解决办法:
问题原因
你当前的代码里,只是用doc.addPageTemplates()添加了一个双栏页面模板,但没有替换掉SimpleDocTemplate默认的单栏页面模板。当你用NextPageTemplate(['TwoCol'])指定下一页用双栏模板后,前两页确实会使用双栏,但当这些双栏页面填满内容后,Reportlab会自动切换回默认的单栏模板创建新页面——这就是后续页面变成单栏的核心原因。
你尝试的临时方案(每40个段落添加一次NextPageTemplate)效果不稳定,是因为NextPageTemplate只对紧接着的下一个页面生效,当那个页面填满后,后续新页面又会回到默认的单栏模板。而且段落长度可能变化,靠固定数量的段落触发切换完全不可靠。
彻底解决办法
要让所有页面都保持双栏,最简单可靠的方式是替换掉默认的页面模板,而不是在默认模板之外添加新模板。具体来说,把doc.addPageTemplates()改成直接赋值给doc.pageTemplates,覆盖掉默认的单栏模板:
from reportlab.platypus import SimpleDocTemplate, Frame, Paragraph from reportlab.platypus import PageTemplate from reportlab.lib.styles import getSampleStyleSheet styles = getSampleStyleSheet() doc = SimpleDocTemplate("try.pdf") style = styles["Normal"] # 定义双栏的两个Frame frame1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width/2 - 6, doc.height, id='col1') frame2 = Frame(doc.leftMargin + doc.width/2 + 6, doc.bottomMargin, doc.width/2 - 6, doc.height, id='col2') # 替换默认页面模板,所有页面都会使用这个双栏模板 doc.pageTemplates = [PageTemplate(id='TwoCol', frames=[frame1, frame2])] Story = [] for rec in range(1, 200): line = ("<para><b>Paragraph %s:</b> " % rec) line += "This is the text of the paragraph. More text of the paragraph." line += " Even more text.</para> " p = Paragraph(line, style) Story.append(p) doc.build(Story)
额外说明
如果你之后需要混合使用不同的页面模板(比如首页双栏、后续单栏,或者其他组合),那才需要用到NextPageTemplate来手动切换模板。但如果你的需求是所有页面都为双栏,直接替换默认模板是最简洁且不易出错的方式。
内容的提问来源于stack exchange,提问作者Mike Eager
相关产品推荐
相关产品推荐

