6

オンページ機能とページ テンプレートを使用して、ドキュメント内のページのサブセットのヘッダーを作成しています。

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

これはエラーなどをスローしませんが、実際には何も描画していないようです。

助けてくれてありがとう!

4

1 に答える 1

5

ここに別のアイデアがあります...

おそらく、コースを更新するために識別できる特定のフローアブルを使用するとうまくいくでしょう。必要に応じてフローアブルにカスタム属性を追加して、フローアブルを識別しやすくすることができます (この投稿を参照)。

たとえば、次のようなことができる場合があります。

...
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

于 2013-03-03T00:22:53.467 に答える