我尝试Python使用reportlab.
发票只有一页,而且单页上的空间永远不会有更多的细节;我的代码在生成 PDF 之前检查最大详细信息数。
现在我正在使用SimpleDocTemplate将所有内容添加到页面,并使用Table. 这是一个简化的代码示例:
from reportlab.lib.units import mm
from reportlab.platypus import Paragraph, Spacer, Table, TableStyle
from reportlab.platypus import SimpleDocTemplate
# add invoice header
flowable_list = [
Spacer(1, 5*mm),
Paragraph('Date: ...', pg_style_1),
Spacer(1, 5*mm),
]
# add invoice details
detail_list = [
('Item 1', 8, 45),
('Item 2', 1, 14),
]
row_list = [
[
Paragraph(desc, pg_style_1),
quantity,
amount,
]
for desc, quantity, amount in detail_list]
story.append(
Table(
data=row_list,
colWidths=[100*mm, 40*mm, 40*mm],
style=TableStyle([
('VALIGN', (0, 0), (-1, -1), 'TOP'),
... some other options ...
])))
# add invoice footer; this should be at a specific position on the page
flowable_list.append(Spacer(1, 5*mm))
flowable_list.append(Paragraph('Total: 0', pg_style_1))
# build PDF
buffer = io.BytesIO()
doc = SimpleDocTemplate(buffer)
doc.build(flowable_list)
我的问题:底部的总金额每次都必须位于特定位置(类似于x*mm底部),但可能有可变数量的详细信息,导致详细信息表具有非固定高度。
我目前的解决方案:Spacer在表后添加一个;这个间隔的高度必须根据表格中的行数来计算(更多的行意味着间隔会更小;更少的行产生更大的间隔)。但是,如果其中一行环绕并占用比单行更多的空间,则此操作将失败。
我的问题:有没有办法为详细信息表设置固定高度,无论有多少行,但仍然继续使用SimpleDocTemplate?
这个类似的问题显示了一个将所有内容手动绘制到画布上的解决方案,但SimpleDocTemplate如果可能的话,我想要一种继续使用 的方法。
翻翻过去那场雪
吃鸡游戏
相关分类