我正在生成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
现在在所有页面上,上边距保持相同,但我希望每页上有不同的边距。
答案 0 :(得分:3)
DocTemplate
类(如SimpleDocTemplate
)填充了PageTemplate
个,然后填充Frame
,然后填充Flowable
(就像你的Table
)。 SimpleDocTemplate
(顾名思义)简化了为您提供最基本设置的商品:DocTemplate
已经有PageTemplate
和基本Frame
,只需要充满Flowable
的。所以这就是问题:DocTemplate
边距对于整个文档是固定的,顺便说一下。您想要调整Frame
的边距!为此,您可以尝试处理当前使用的框架,也可以开始使用更精细的BaseDocTemplate
并定义自己的PageTemplate
和Frame
。我建议您阅读第5章reportlab user guide下的相应页面,然后搜索BaseDocTemplate
示例,其中显示Frame
和PageTemplate
的生成。
另一种选择是不直接使用边距。您可以使用Spacer()
添加垂直空间和表格的colWidth来调整水平宽度,但这并不是很有趣。 SimpleDocTemplate
在构建函数中添加了PageTemplates
和Frames
,因此我们无法在此之前修改它们。如果您需要更广泛的示例,则需要发布更多代码,以便我可以看到您真正想要的内容,因为您的代码只生成一个页面。
<强>更新强>
以下是如何使用帧大小调整不同页面上的边距的示例。还可以调整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)