gpt4 book ai didi

python - reportlab 中的条件分页符

转载 作者:太空狗 更新时间:2023-10-29 21:04:00 32 4
gpt4 key购买 nike

我正在使用 Reportlab platypus 创建 PDF 表格。我不知道,当页面因动态内容而满时。如果我在页面末尾,我该如何结帐?

platypus有没有检查页尾的方法?

我有公司名单,每家公司都有多个业务部门负责。

   companies = [('company1', 'businessunit1', 500),
('company1', 'businessunit2',400),
('company2', 'businessunit3',200),
('company2', 'businessunit4', 700),
('company3', 'businessunit5', 800)
]

上面的列表应该为一个公司生成 3 个表,但是如果这个列表有多个公司,它将生成多个表,并且如果任何表到达页面末尾,就会中断。

      fields = ['company name', 'business unit name', 'charge']
for i, comp in enumerate(companies):
charges = []
document.append(Paragraph("<b>%s</b>" %comp[i][0], STYLES['COMPANY_NAME']))
document.append(Spacer(1, 5))
charges.append(comp[i][0])
charges.append(comp[i][1])
charges.append(comp[i][2])
charges_table = LongTable([fields] + charges, colWidths=(30,150,100))
charges_table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.gray),
('FONTSIZE', (0, 0), (-1, 0), 6),
('GRID', (0, 0), (-1, -1), 1, colors.gray),
('FONTSIZE', (0, 0), (-1, -1), 7),
('TEXTCOLOR',(0,-1),(-1,-1),'#FF4500'),
])
)

charges_table.hAlign = 'CENTER'
document.append(charges_table)

最佳答案

您应该提供一些示例代码,以便我们了解您要完成的任务。为什么要知道页面何时结束?绘制新内容?要打印出一些诊断信息?

假设您想在页面呈现后绘制一些东西,可以使用 BaseDocTemplate 类中提供的 afterPage() 方法。来自 ReportLab 的文档:

This is called after page processing, and immediately after the afterDrawPage method of the current page template. A derived class could use this to do things which are dependent on information in the page such as the first and last word on the page of a dictionary.

基本上,它在页面绘制后由 BaseDocTemplate 调用。在源代码中,它包含 self,因为它是 BaseDocTemplate 类的一部分,因此您可以访问它的 Canvas !

您可以在自己的脚本中覆盖该类,然后直接在 Canvas 上绘制。

from reportlab.platypus import BaseDocTemplate
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import A4
from reportlab.platypus import Paragraph

class MyDocTemplate(BaseDocTemplate):
"""Override the BaseDocTemplate class to do custom handle_XXX actions"""

def __init__(self, *args, **kwargs):
BaseDocTemplate.__init__(self, *args, **kwargs)

def afterPage(self):
"""Called after each page has been processed"""

# saveState keeps a snapshot of the canvas state, so you don't
# mess up any rendering that platypus will do later.
self.canv.saveState()

# Reset the origin to (0, 0), remember, we can restore the
# state of the canvas later, so platypus should be unaffected.
self.canv._x = 0
self.canv._y = 0

style = getSampleStyleSheet()

p = Paragraph("This is drawn after the page!", style["Normal"])

# Wraps and draws the paragraph onto the canvas
# You can change the last 2 parameters (canv, x, y)
p.wrapOn(self.canv, 2*inch, 2*inch)
p.drawOn(self.canv, 1*inch, 3*inch)

# Now we restore the canvas back to the way it was.
self.canv.restoreState()

现在您可以像在主逻辑中使用 BaseDocTemplate 一样使用 MyDocTemplate:

if __name__ == "__main__":

doc = MyDocTemplate(
'filename.pdf',
pagesize=A4,
rightMargin=.3*inch,
leftMargin=.3*inch,
topMargin=.3*inch,
bottomMargin=.3*inch
)

elements = [
# Put your actual elements/flowables here, however you're generating them.
]

doc.addPageTemplates([
# Add your PageTemplates here if you have any, which you should!
])

# Build your doc with your elements and go grab a beer
doc.build(elements)

关于python - reportlab 中的条件分页符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11071150/

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