gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:18 29 4
gpt4 key购买 nike

我正在生成一个 PDF,但我无法为不同的页面提供不同的上边距。

有没有什么方法或者途径可以解决这个问题?

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

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

最佳答案

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

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

更新

这里是一个关于如何使用 Frame-size 调整不同页面边距的例子。还可以调整 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)

关于python - 如何使用 reportlab simpledoctemplate 为不同的页面分配 doc.topMargin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21696462/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com