2013-02-16 50 views
4

我在页面上使用功能和页面模板,使头对我的文档页面的一个子集:ReportLab的:数据头信息

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() 

这个伟大的工程,但则传递过程变量(每个页面的部分改变)是序列中的最后一个,因为这个功能不是真的叫,直到最终版本(我认为这是如何有用)。我需要的是做到这一点,使价值是在网页上的价值。如果我可以在我写页面的时候绘制它,那也可以。这是我尝试在那:

#################################################################################### 
# 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"])) 

这不会引发错误或任何东西,但它似乎并不实际绘制任何东西,无论是。

感谢您的帮助!

+0

afterPage或afterDrawPage可能会涉及,但我不知道如何构建这些来使用当前页面的信息 – DeltaG 2013-02-17 12:46:06

+0

您可以提供更多关于第一次尝试的'course'变量的上下文。它如何/在哪里设置/更改?你有一个包含'HeaderOverview'需要使用的课程的列表吗? – grc 2013-03-01 12:44:33

+0

我正在循环设置课程列表,每次我编写新课程的页面时都会调用此函数。在循环遍历整个列表之后,我有一组页面,并且课程变量会更改每个页面或每个其他页面,以反映页面上的信息。 – DeltaG 2013-03-01 16:38:49

回答

2

这里的另一个想法...

也许将努力使用可识别更新过程中的具体悬浮剂。如有必要,您可以将自定义属性添加到流水线中以帮助识别它们(请参阅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) 

然后你可以检查之后被渲染,看看每个可流动它具有该属性并在当前的过程中更新它。

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

doc.afterFlowable = afterFlowable 

HeaderOverview将能够使用current_course变量获得正确的道路,因为这两个HeaderOverviewafterFlowable的最终版本中的不同点调用。

+0

如果我像这样使用它:doc.build(report,onFirstPage = Header,onLaterPages = HeaderOverview),那么是不是每个页面都调用它? – DeltaG 2013-03-03 19:02:01

+0

以编程方式?如果我能做得很好,我不需要试图在标题中这样做,但是在RL中没有很好的方法来计算文本占用的垂直空间。我有85%的时间工作,但这还不够好。 – DeltaG 2013-03-04 00:11:17

+0

我需要再深入一点,但我认为它有承诺,所以我会在这一点上接受/奖励。当我知道这里的整个瓢时,我会报告回来。谢谢您的帮助! – DeltaG 2013-03-05 03:43:29