bugfix> python > 投稿

これは、 reportlab を使用してPDFファイルにテキストを書き込むために機能します :

from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
c = canvas.Canvas("test.pdf")
c.drawString(1 * cm, 29.7 * cm - 1 * cm, "Hello")
c.save()

しかし、複数行のテキストを処理する場合、 x, y を処理する必要があるのは不快です各新しい行の座標:

text = "Hello\nThis is a multiline text\nHere we have to handle line height manually\nAnd check that every line uses not more than pagewidth"
c = canvas.Canvas("test.pdf")
for i, line in enumerate(text.splitlines()):
    c.drawString(1 * cm, 29.7 * cm - 1 * cm - i * cm, line)
c.save()

reportlab でこれを行うより賢い方法はありますか ?

回答 1 件
  • 1つのオプションは、reportlabが提供するFlowablesを使用することです。flowable要素の1つのタイプは Paragraph です 。段落サポート <br>  改行として。

    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import A4
    from reportlab.platypus import SimpleDocTemplate, Paragraph
    from reportlab.lib.styles import getSampleStyleSheet
    from reportlab.lib.units import cm
    my_text = "Hello\nThis is a multiline text\nHere we do not have to handle the positioning of each line manually"
    doc = SimpleDocTemplate("example_flowable.pdf",pagesize=A4,
                            rightMargin=2*cm,leftMargin=2*cm,
                            topMargin=2*cm,bottomMargin=2*cm)
    doc.build([Paragraph(my_text.replace("\n", "<br />"), getSampleStyleSheet()['Normal']),])
    
    

    2番目のオプションは、 drawText を使用することです  と TextObject

    c = canvas.Canvas("test.pdf")
    textobject = c.beginText(2*cm, 29.7 * cm - 2 * cm)
    for line in my_text.splitlines(False):
        textobject.textLine(line.rstrip())
    c.drawText(textobject)
    c.save()
    
    

あなたの答え