0

我想在 Reportlab 中生成两列页面。附加程序(改编自各种示例)生成两列两页,然后生成单列页。

我尝试为第一页和后续页面创建多个页面模板。这不会改变输出。

from reportlab.platypus import SimpleDocTemplate, Frame, Paragraph
from reportlab.platypus import Spacer, PageTemplate, NextPageTemplate
from reportlab.lib.styles import getSampleStyleSheet

styles = getSampleStyleSheet()

doc = SimpleDocTemplate ("try.pdf")
style = styles["Normal"]

#Two Columns
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.addPageTemplates(PageTemplate(id='TwoCol', frames=[frame1,frame2]))

Story = []
Story.append (NextPageTemplate(['TwoCol']))

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>\n"
    p = Paragraph(line, style)
    Story.append(p)

doc.build (Story)

我在“Story.append(p)”之后添加了以下内容,看看它是否是一种解决方法:

    if rec % 40 == 0: 
        Story.append (NextPageTemplate(['TwoCol']))

现在,第 1 页和第 2 页是两列,第 3 页是一列,第 4 页和第 5 页是两列。

4

1 回答 1

0

我看了一下 SimpleDocTemplate.build()。它创建一个完整的页面框架(id='First')并将其添加到文档的 pageTemplates 列表中。

看起来 BaseDocTemplate.build() 为它将要生成的每个页面选择下一个 pageTemplate。我认为这会导致有时选择默认值。

我用 BaseDocTemplate 替换了 SimpleDocTemplate。现在所有页面都生成了两列。

于 2019-07-31T00:12:04.013 回答