9

Reportlab カモノハシで PDF テーブルを作成しています。動的コンテンツのためにページがいついっぱいになるかわかりません。ページの最後にいる場合、どうすればチェックアウトできますか?

カモノハシにページの終わりを確認する方法はありますか?

私は会社のリストを持っており、各会社には複数のビジネスユニットがあり、それぞれの費用がかかります。

   companies = [('company1', 'businessunit1', 500),
                ('company1', 'businessunit2',400),
                ('company2', 'businessunit3',200),
                ('company2', 'businessunit4', 700),
                ('company3', 'businessunit5', 800)
               ]

上記のリストは、1 つの会社ごとに 3 つのテーブルを生成する必要がありますが、このリストに複数の会社が含まれていると、複数のテーブルが生成され、いずれかのテーブルがページの終わりに達すると壊れます。

      fields = ['company name', 'business unit name', 'charge']
      for i, comp in enumerate(companies):
          charges = []
          document.append(Paragraph("<b>%s</b>" %comp[i][0], STYLES['COMPANY_NAME']))
          document.append(Spacer(1, 5))
          charges.append(comp[i][0])
          charges.append(comp[i][1])
          charges.append(comp[i][2])
          charges_table = LongTable([fields] + charges, colWidths=(30,150,100))
          charges_table.setStyle(TableStyle([
                          ('BACKGROUND', (0, 0), (-1, 0), colors.gray),
                          ('FONTSIZE', (0, 0), (-1, 0), 6),
                          ('GRID', (0, 0), (-1, -1), 1, colors.gray),
                          ('FONTSIZE', (0, 0), (-1, -1), 7),
                          ('TEXTCOLOR',(0,-1),(-1,-1),'#FF4500'),
                          ])
                          )

          charges_table.hAlign = 'CENTER'
          document.append(charges_table)
4

4 に答える 4

7

達成しようとしていることがわかるように、いくつかのサンプル コードを提供する必要があります。ページがいつ終了したかを知りたいのはなぜですか? 新しいコンテンツを描くには?診断情報を印刷するには?

ページがレンダリングされた後に何かを描画したいと仮定すると、クラスafterPage()で提供されるメソッドを使用できます。BaseDocTemplateReportLab のドキュメントから:

これは、ページ処理の後、現在のページ テンプレートの afterDrawPage メソッドの直後に呼び出されます。派生クラスはこれを使用して、辞書のページの最初と最後の単語など、ページの情報に依存することを行うことができます。

基本的にBaseDocTemplate、ページが描画された後に呼び出されます。ソース コードにはself、クラスの一部として が含まれているBaseDocTemplateため、そのキャンバスにアクセスできます。

独自のスクリプトでクラスをオーバーライドしてから、キャンバスに直接描画できます。

from reportlab.platypus import BaseDocTemplate
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.lib.pagesizes import A4
from reportlab.platypus import Paragraph

class MyDocTemplate(BaseDocTemplate):
    """Override the BaseDocTemplate class to do custom handle_XXX actions"""

    def __init__(self, *args, **kwargs):
        BaseDocTemplate.__init__(self, *args, **kwargs)

    def afterPage(self):
        """Called after each page has been processed"""

        # saveState keeps a snapshot of the canvas state, so you don't
        # mess up any rendering that platypus will do later.
        self.canv.saveState()

        # Reset the origin to (0, 0), remember, we can restore the
        # state of the canvas later, so platypus should be unaffected.
        self.canv._x = 0
        self.canv._y = 0

        style = getSampleStyleSheet()

        p = Paragraph("This is drawn after the page!", style["Normal"])

        # Wraps and draws the paragraph onto the canvas
        # You can change the last 2 parameters (canv, x, y)
        p.wrapOn(self.canv, 2*inch, 2*inch)
        p.drawOn(self.canv, 1*inch, 3*inch)

        # Now we restore the canvas back to the way it was.
        self.canv.restoreState()

これMyDocTemplateで、メイン ロジックで BaseDocTemplate を使用するのと同じ方法を使用できます。

if __name__ == "__main__":

    doc = MyDocTemplate(
        'filename.pdf',
        pagesize=A4,
        rightMargin=.3*inch,
        leftMargin=.3*inch,
        topMargin=.3*inch, 
        bottomMargin=.3*inch
    )

    elements = [
        # Put your actual elements/flowables here, however you're generating them.
    ]

    doc.addPageTemplates([
        # Add your PageTemplates here if you have any, which you should!
    ])

    # Build your doc with your elements and go grab a beer
    doc.build(elements)
于 2012-07-01T17:39:13.117 に答える
0

自分で使用した行を数えなければなりません。以下を含む手順を使用します。

lin += inc
if lin > 580:
    doc.append(PageBreak())
    lin = 5

テーブルが使用する行数を知ることで、ページの残りの部分に収まるかどうかを知ることができます。

異なる高さの線を処理できるように、「ポイント」のカウントを使用します。

于 2012-07-05T18:58:17.123 に答える
0

複数のページにまたがるテーブルを分割するには、 How to split ReportLab table across PDF page (side by side)?に従って、独自のテンプレートを使用する必要があります。

表は、ページの最後に達したときに自動的に分割する必要があります。しかし、ここに私が見つけた別の例があります:

于 2012-07-06T20:19:42.207 に答える