2013-02-16 49 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