我正在尝试重构一个生成几个四页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)
如何阻止这种情况发生并生成完整的页面?所有其他页面方法和页脚方法都是发布的方法的变体。
答案 0 :(得分:0)
这在reportlab文档中并不清楚,但是如果使用简单的doc模板,则需要添加NextPageTemplate以启动新的Page Object以包含所有帧。因此,在这种情况下,您只需将elements.append(NextPageTemplate('SecondPage'))
添加到生成第一页的方法的末尾。