gpt4 book ai didi

python - Reportlab:带有页面数据的标题

转载 作者:太空狗 更新时间:2023-10-30 01:16:16 25 4
gpt4 key购买 nike

我正在使用页面功能和页面模板为文档中的部分页面制作标题:

templates.append(PageTemplate(id='Overview', frames=frame, onPage=HeaderOverview))

此模板的头函数:

################################
# Function HeaderOverview - header for overview page
def HeaderOverview(canvas,doc):
canvas.saveState()
headboxh = 15
headboxx = 20
headboxy = 730
headboxw = 570
canvas.rect(headboxx, headboxy, headboxw, headboxh, fill=1)
canvas.setFillColor(colors.black)
canvas.setFont("Helvetica", 14)
canvas.setFillColor(colors.white)

canvas.drawString(headboxx + 15,headboxy+.25*headboxh,"Mathematics")
textWidth = stringWidth("Mathematics", "Helvetica", 12)
canvas.setFont("Helvetica", 12)
canvas.drawString(headboxw - 15 - textWidth,headboxy+.25*headboxh,course)

canvas.restoreState()

这很好用,除了传递的 course 变量(随着章节中的每一页而变化)是序列中的最后一个,因为直到最终构建才真正调用此函数(我认为这就是它的工作原理) .我需要的是这样做,以便该值是页面上的值。如果我可以在编写页面本身时绘制它,那也很好。这是我的尝试:

####################################################################################
# Function makeGradeOverview(course): makes Overview chart for grade
#
def makeGradeOverview(canvas, course):
report.append(NextPageTemplate("Overview"))
report.append(PageBreak())

headboxh = 50
headboxx = 20
headboxy = 600#730
headboxw = 540

canvas.saveState()
canvas.setFont("Helvetica", 12)
textWidth = stringWidth(course, "Helvetica", 12)
canvas.drawString(headboxw - 15 - textWidth,headboxy+.25*headboxh,course)
canvas.restoreState()
# put course name as title
if len(course)<=2:
headerrow = ''.join(['Grade ', course, ' Overview'])
else:
headerrow = ''.join([course, ' Overview'])
report.append(Paragraph(headerrow, styles["Overview Title"]))

report.append(Spacer(1, 16))

GridInfo = []
topics = topiclist(course)

for topic in topics:
report.append(Paragraph(topic, styles["Overview Sub"]))
report.append(Spacer(1, 8))

subtopics = subtopiclist(course, topic)

sublist = []
for subtopic in subtopics:
report.append(Paragraph(''.join([r'<bullet>&bull</bullet>',subtopic]), styles["Overview Table"]))

这不会抛出错误或任何东西,但它似乎也不会真正绘制任何东西。

感谢您的帮助!

最佳答案

这是另一个想法......

也许使用可以识别的特定可流动对象来更新类(class)会奏效。如有必要,您可以向可流动对象添加自定义属性以帮助识别它们(参见 this 帖子)。

例如,您可以这样做:

...
report.append(some_content)

report.append(PageBreak())
report[-1].new_course = True # gives that PageBreak flowable a custom attribute

report.append(some_more_content)
...

并设置一些变量:

course_list = [...]
course_iter = iter(course_list)
current_course = next(course_iter)

然后您可以在渲染后检查每个 flowable 以查看它是否具有该属性,如果有则更新当前类(class)。

def afterFlowable(flowable):
global current_course
if hasattr(flowable, 'new_course'):
current_course = next(course_iter)

doc.afterFlowable = afterFlowable

HeaderOverview 将能够使用 current_course 变量来获得正确的类(class),因为 HeaderOverviewafterFlowable 在最终构建期间的不同点被调用。

关于python - Reportlab:带有页面数据的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14913018/

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