Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Reportlab:包含来自页面的数据的标题_Python_Reportlab - Fatal编程技术网

Python Reportlab:包含来自页面的数据的标题

Python Reportlab:包含来自页面的数据的标题,python,reportlab,Python,Reportlab,我正在使用on page功能和页面模板为文档中的页面子集生成标题: templates.append(PageTemplate(id='Overview', frames=frame, onPage=HeaderOverview)) 此模板的标题函数: ################################ # Function HeaderOverview - header for overview page def HeaderOverview(canvas,doc):

我正在使用on page功能和页面模板为文档中的页面子集生成标题:

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"]))
####################################################################################
#函数makeGradeOverview(课程):制作成绩概览图
#
def MakeGrade概述(画布、课程):
报告.附加(NextPagetTemplate(“概述”))
report.append(PageBreak())
井架H=50
井架X=20
人头箱Y=600#730
床头箱W=540
canvas.saveState()
canvas.setFont(“Helvetica”,12)
textWidth=stringWidth(课程“Helvetica”,12)
帆布.抽绳(床头箱W-15-textWidth,床头箱Y+.25*床头箱H,球场)
canvas.restoreState()
#将课程名称作为标题
如果len(当然)这里有另一个想法

也许可以使用可以识别的特定流动物来更新课程。如有必要,您可以将自定义属性添加到FlowTables中,以帮助识别它们(请参阅文章)

例如,您可能可以执行以下操作:

...
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后检查它是否具有该属性,如果具有该属性,则更新当前课程

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

doc.afterFlowable = afterFlowable

HeaderOverview
将能够使用
current\u course
变量来获得正确的路线,因为在最终构建过程中的不同点调用了
HeaderOverview
afterFlowable

可能涉及afterPage或afterDrawPage,但是我不知道如何构造这些函数来使用当前页面中的信息。您是否可以提供更多关于第一次尝试中的
课程
变量的上下文。如何设置/在何处更改?您是否有一个包含
HeaderOverview
需要使用的课程的列表?我在一个设置的课程列表中循环,每次编写新课程的页面时都调用此函数。循环浏览整个列表后,我有一组页面,课程变量每一页或每一页都会更改,以反映页面上的信息。*通过“this function”,我指的是makeGradeOverview函数。是否可以为每个课程创建一个可用于
HeaderOverview
函数的iterable?如果我像这样使用它:doc.build(report,onFirstPage=Header,onLaterPages=HeaderOverview),那么它不是为每个页面调用的吗?编程方式?如果我能做到这一点,我就不需要在标题中尝试这样做,但是在RL中没有一个很好的工具来计算文本占用的垂直空间。我有一些东西在85%的时间里都能用,但这还不够好。我需要再深入一点,但我认为它有希望,所以现在我会接受赏金。当我知道全部独家新闻后,我会向你汇报的。谢谢你的帮助!唉,有两个问题:afterFlowable不能作为函数名使用,但在重命名后,它会运行,但不影响输出-它们仍然打印有序列中最后一个课程的名称。我忘记的一件事是,
current\u course
必须在
afterFlowable
函数开始时声明为全局变量(例如,
global current\u course
)。我已经用这种方法制作了一个简化版本,在这次调整后似乎可以工作。我不知道你所说的
afterFlowable
不作为函数名工作是什么意思(这个名称已经在使用了吗?)。如果顺序仍然不正确,请尝试在
afterFlowable
HeaderOverview
函数中打印任何内容,以查看调用每个函数的时间。顺便说一句,我删除了一些我的评论,以减少混乱。