gpt4 book ai didi

python - Python Reportlab 中的动态帧大小

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:08 24 4
gpt4 key购买 nike

我尝试用 生成发货 list 在 Python 中。我试图通过使用 Platypus Frames 将所有部分(如发件人地址、收件人地址、表格)放在适当的位置。

我遇到的第一个问题是我需要很多Frames来正确定位所有东西,有没有更好的方法使用Platypus?因为我希望发件人地址和我的地址在同一高度,如果我只是将它们添加到我的 story = [],它们就会一个一个地对齐。

下一个问题 是我正在绘制的表格的大小是动态的,当我到达 Frame 的末尾时(我希望表格移动的空间)它只是执行 FrameBreak 并在下一帧中继续。那么如何使 Frame(表格空间)动态化呢?

最佳答案

您的用例非常常见,因此 Reportlab 有一个系统可以帮助您。

如果您阅读关于platypus 的用户指南,它将向您介绍 4 个主要概念:

DocTemplates the outermost container for the document;

PageTemplates specifications for layouts of pages of various kinds;

Frames specifications of regions in pages that can contain flowing text or graphics.

FlowablesUsing PageTemplates you can combine "static" content with dynamic on a page in a sensible way like for example logo's, addresses and such.

您已经发现了 FlowablesFrames 但可能您还没有开始使用 fancyPageTemplatesDocTemplates .这是有道理的,因为对于大多数简单文档来说,这不是必需的。遗憾的是,运输 list 不是一个简单的文件,它包含必须在每一页上显示的地址、 Logo 和重要信息。这就是 PageTemplates 发挥作用的地方。

那么如何使用这些模板呢?这个概念很简单,每个页面都有特定的结构,页面之间可能会有所不同,例如,在第一页上您想要放置地址然后启动表格,而在第二页上您只需要表格。这将是这样的:

第 1 页: enter image description here

第 2 页: enter image description here

一个例子看起来像这样:

(如果有用于 Reportlab 的 SO 文档,这将是完美的)

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, NextPageTemplate, Paragraph, PageBreak, Table, \
TableStyle


class ShippingListReport(BaseDocTemplate):
def __init__(self, filename, their_adress, objects, **kwargs):
super().__init__(filename, page_size=A4, _pageBreakQuick=0, **kwargs)
self.their_adress = their_adress
self.objects = objects

self.page_width = (self.width + self.leftMargin * 2)
self.page_height = (self.height + self.bottomMargin * 2)


styles = getSampleStyleSheet()

# Setting up the frames, frames are use for dynamic content not fixed page elements
first_page_table_frame = Frame(self.leftMargin, self.bottomMargin, self.width, self.height - 6 * cm, id='small_table')
later_pages_table_frame = Frame(self.leftMargin, self.bottomMargin, self.width, self.height, id='large_table')

# Creating the page templates
first_page = PageTemplate(id='FirstPage', frames=[first_page_table_frame], onPage=self.on_first_page)
later_pages = PageTemplate(id='LaterPages', frames=[later_pages_table_frame], onPage=self.add_default_info)
self.addPageTemplates([first_page, later_pages])

# Tell Reportlab to use the other template on the later pages,
# by the default the first template that was added is used for the first page.
story = [NextPageTemplate(['*', 'LaterPages'])]

table_grid = [["Product", "Quantity"]]
# Add the objects
for shipped_object in self.objects:
table_grid.append([shipped_object, "42"])

story.append(Table(table_grid, repeatRows=1, colWidths=[0.5 * self.width, 0.5 * self.width],
style=TableStyle([('GRID',(0,1),(-1,-1),0.25,colors.gray),
('BOX', (0,0), (-1,-1), 1.0, colors.black),
('BOX', (0,0), (1,0), 1.0, colors.black),
])))

self.build(story)

def on_first_page(self, canvas, doc):
canvas.saveState()
# Add the logo and other default stuff
self.add_default_info(canvas, doc)

canvas.drawString(doc.leftMargin, doc.height, "My address")
canvas.drawString(0.5 * doc.page_width, doc.height, self.their_adress)

canvas.restoreState()

def add_default_info(self, canvas, doc):
canvas.saveState()
canvas.drawCentredString(0.5 * (doc.page_width), doc.page_height - 2.5 * cm, "Company Name")

canvas.restoreState()


if __name__ == '__main__':
ShippingListReport('example.pdf', "Their address", ["Product", "Product"] * 50)

关于python - Python Reportlab 中的动态帧大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39266415/

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