如何使用reportlab simpledoctemplate为不同的页面分配doc.topMargin

时间:2014-02-11 08:15:56

标签: python reportlab

我正在生成PDF,但我无法为不同的页面提供不同的topmargins。

有什么方法或方法可以解决这个问题吗?

response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachments;filename='aa.pdf'
doc = SimpleDocTemplate(response)
elements = []
table_data = [["Cash Management -"],
              ["individuelle Kond-"],
              ["Cash Mas -"],
              ["Terms and Condppe"],
              ]
table_dimension = Table(table_data, colWidths=[19.8 * cm], rowHeights=(.23*inch))
table_dimension.setStyle(TableStyle([
                          ('BACKGROUND',(0,0),(0,3),'0x2E8B57'),
                          ('TEXTCOLOR',(0,0),(0,3),'0xFFFFFF'),
                          ('FONT', (0,0), (0,3), 'Times-Italic'),
                          ('ALIGN',(0,0),(0,3),'CENTER'),
                          ("VALIGN",(0,2),(0,2),"BOTTOM"),
                          ('FONTSIZE',(0,0),(0,1),14)
                ]))
elements.append(table_dimension)
doc.topMargin=.13* inch
doc.build(elements)
return response

现在在所有页面上,上边距保持相同,但我希望每页上有不同的边距。

1 个答案:

答案 0 :(得分:3)

DocTemplate类(如SimpleDocTemplate)填充了PageTemplate个,然后填充Frame,然后填充Flowable (就像你的Table)。 SimpleDocTemplate(顾名思义)简化了为您提供最基本设置的商品:DocTemplate已经有PageTemplate和基本Frame,只需要充满Flowable的。所以这就是问题:DocTemplate边距对于整个文档是固定的,顺便说一下。您想要调整Frame的边距!为此,您可以尝试处理当前使用的框架,也可以开始使用更精细的BaseDocTemplate并定义自己的PageTemplateFrame。我建议您阅读第5章reportlab user guide下的相应页面,然后搜索BaseDocTemplate示例,其中显示FramePageTemplate的生成。

另一种选择是不直接使用边距。您可以使用Spacer()添加垂直空间和表格的colWidth来调整水平宽度,但这并不是很有趣。 SimpleDocTemplate在构建函数中添加了PageTemplatesFrames,因此我们无法在此之前修改它们。如果您需要更广泛的示例,则需要发布更多代码,以便我可以看到您真正想要的内容,因为您的代码只生成一个页面。

<强>更新

以下是如何使用帧大小调整不同页面上的边距的示例。还可以调整PageTemplates的大小。我认为你应该能够理解代码,但同样:你是BaseDocTemplate,而不是SimpleDocTemplate。如果您在第一页上有一个跨越第一页的表格,则无需添加PageBreak(),但NextPageTemplate()是强制性的!

"""
Example how to adjust the Frame-size in a BaseDocTemplate
"""
from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageBreak, PageTemplate
from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet

def on_first_page(canvas,doc):
    canvas.saveState()
    canvas.setFont('Times-Roman',19)
    canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
    canvas.restoreState()

def on_remaining_pages(canvas,doc):
    canvas.saveState()
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
    canvas.restoreState()

# creation of the BaseDocTempalte. showBoundary=0 to hide the debug borders
doc = BaseDocTemplate('basedoc.pdf',showBoundary=1)

# create the frames. Here you can adjust the margins
frame_first_page = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='first')
frame_remaining_pages = Frame(doc.leftMargin + 1*inch, doc.bottomMargin + 1*inch, doc.width - 2*inch, doc.height - 2*inch, id='remaining')

# add the PageTempaltes to the BaseDocTemplate. You can also modify those to adjust the margin if you need more control over the Frames.
doc.addPageTemplates([PageTemplate(id='first_page',frames=frame_first_page, onPage=on_first_page),
                      PageTemplate(id='remaining_pages',frames=frame_remaining_pages, onPage=on_remaining_pages),
                      ])

styles=getSampleStyleSheet()
# start the story...
Elements=[]

Elements.append(Paragraph("Frame first page!",styles['Normal']))
Elements.append(NextPageTemplate('remaining_pages'))  #This will load the next PageTemplate with the adjusted Frame. 
Elements.append(PageBreak()) # This will force a page break so you are guarented to get the next PageTemplate/Frame

Elements.append(Paragraph("Frame remaining pages!,  "*500,styles['Normal']))

#start the construction of the pdf
doc.build(Elements)