抽象画布方法会导致元素在自己的页面上绘制?

时间:2014-12-23 23:31:07

标签: python python-3.x reportlab

我正在尝试重构一个生成几个四页pdf的脚本,并将一个非常长的> 400行脚本抽象成几个方法。我有方法绘制每个页脚并创建四个页面中的每一个。问题在于,当我调用doc.addPageTemplates()时,仅在给定单个模板时才有效。如果我尝试添加多个元素,则会为每个元素创建一个单独的页面。

例如,此方法生成第二页:

def page_two():

f_title = Frame(width - doc.rightMargin - graph_width + 0.2 * inch,
                     doc.bottomMargin + footer_height + 7,
                     graph_width, cap_height,
                     leftPadding=0, rightPadding=0,
                     topPadding=0, bottomPadding=0,
                     id='title')

f_graph = Frame(width - doc.rightMargin - graph_width,
                     doc.bottomMargin + footer_height,
                     graph_width, cap_height,
                     leftPadding=0, rightPadding=0,
                     topPadding=0, bottomPadding=0,
                     id='graph')

post_header_space = 3
elements.append(Paragraph("LOREM IPSUM DOLOR SIT AMET"
                          , styles['body_heading']))
elements.append(Spacer(1, post_header_space))
yld_para = "lorem ipsum dolor sit amet consectetur adipiscing elit"
elements.append(Paragraph(yld_para
                          , styles['body_text']))
elements.append(FrameBreak())

elements.append(Spacer(1, 40))

elements.append(Paragraph("%s YLDs by cause and age 2010" % country_name
                          , styles['fig_cap']))
elements.append(FrameBreak())
elements.append(Paragraph("LOREM IPSUM DOLOR SIT AMET"
                          , styles['body_heading']))
elements.append(Spacer(1, post_header_space))


elements.append(FrameBreak())
elements.append(Spacer(1, 10))

elements.append(FrameBreak())

elements.append(PageBreak())
return PageTemplate(id='SecondPage', frames=[f_title, f_graph], onPage=foot_dash_2)

这会产生它的页脚:

def foot_dash_2(canvas, doc):
    arrow_scale = 1.0
    canvas.translate(-.23 * inch, -9.9 * inch)
    canvas.scale(arrow_scale, arrow_scale)
    canvas.restoreState()
    canvas.scale(arrow_scale, arrow_scale)

    canvas.restoreState()
    arrow_scale = 0.55
    canvas.translate(doc.leftMargin + 126.0 + 7.5 * inch, 31.0 - 0.2 * inch)
    canvas.scale(arrow_scale, arrow_scale)
    canvas.rotate(90)

    canvas.restoreState()
    canvas.saveState()
    canvas.setLineWidth(0.4)
    canvas.setDash(0.4, 5)
    line_height = 329.8 + 72.0 + dash_buffer / 2

    canvas.line(doc.leftMargin, line_height, width - doc.rightMargin, line_height)
    canvas.restoreState()

    canvas.saveState()

    canvas.setFont('Helvetica', 22)
    canvas.setFillColorCMYK(81 / 100.0, 45 / 100.0, 53 / 100.0, 23 / 100.0)  # choose fill colour
    canvas.rect(0, doc.bottomMargin - 3, width, 15, fill=1, stroke=0)
    left_foot = Paragraph("http://www.example.cp,",
                          styles['left_footer_1'])
    w, h = left_foot.wrap(doc.width, doc.bottomMargin)
    left_foot.drawOn(canvas, doc.leftMargin, doc.bottomMargin - foot_displace)
    right_foot = Paragraph(" %s | Text | page %d" % (country_name, 2),
                           styles['right_footer_1'])
    w, h = right_foot.wrap(doc.width, doc.bottomMargin)
    right_foot.drawOn(canvas, doc.rightMargin, doc.bottomMargin - foot_displace)
    canvas.restoreState()
    # Y axis label
    canvas.saveState()
    canvas.setFont('OpenSans', 7)
    canvas.setFillColorRGB(0, 0, 0, 1)
    canvas.rotate(90)
    canvas.drawString(2 * inch, -3.2 * inch, "Percent change 1990-2010")
    canvas.restoreState()

如您所见,page_two()方法将元素添加到元素列表并返回PageTemplate对象。

我生成这样的PDF:

doc.addPageTemplates([page_two()])
doc.build(elements)

这很有效。但是,如果我想添加多个页面模板,那么唯一正确的页面就是第一个页面,然后reportlab为每个单独的元素生成一个页面:

doc.addPageTemplates([page_one(), page_two(), page_three(), page_four()])
doc.build(elements)

如何阻止这种情况发生并生成完整的页面?所有其他页面方法和页脚方法都是发布的方法的变体。

1 个答案:

答案 0 :(得分:0)

这在reportlab文档中并不清楚,但是如果使用简单的doc模板,则需要添加NextPageTemplate以启动新的Page Object以包含所有帧。因此,在这种情况下,您只需将elements.append(NextPageTemplate('SecondPage'))添加到生成第一页的方法的末尾。