简体   繁体   中英

Align text on the right side in reportlab python

I am doing a report in python reportlab. And I want to align some text from the right side. But each line of text has a different length, and I have to set coordinates manually. How can I do it dynamically?

 pdf.setFont('Helvetica', 9)
    pdf.drawString(400,600,"Rechnungsdatum: "+today)
    pdf.drawString(390,590,"Leistungserbringung: "+master_data.loc[master_data['company']==company]['Leistungserbringung'][0]) #cus_specific
    pdf.drawString(343,580,"Leistungszeitraum: "+start+" - "+end)
    pdf.drawString(372,570,"Rechnungsnummer: "+master_data.loc[master_data['company']==company]['Rechnungsnummer'][0]) #cus_specific
    pdf.drawString(398,560,"Lieferantennummer: "+master_data.loc[master_data['company']==company]['Lieferantennummer'][0]) #cus_specific
    pdf.drawString(432,550,"Zahlungsziel: " +str((date.today().replace(day=1) - timedelta(days=1)).day)+ " Tage")

That's how it looks like:

[ 这就是它的样子 ]

I want all lines to be aligned from the right side for a beautiful view. I am using Canvas and drawing each string via drawString(). Any help will be appreciated)

You can get canvas width using Canvas._pagesize[0] , Canvas object has drawRightString method for right-aligning lines.

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.units import inch, mm, cm, pica
from datetime import date, timedelta

if __name__ == "__main__":
    pdf = Canvas("output.pdf")
    pdf.setFont('Helvetica', 9)

    master_data = ...
    start = ...
    end = ...
    company = ...
    today = ...

    lines = [
        "Rechnungsdatum: "+today,
        "Leistungserbringung: "+master_data.loc[master_data['company']==company]['Leistungserbringung'][0],
        "Leistungszeitraum: "+start+" - "+end,
        "Rechnungsnummer: "+master_data.loc[master_data['company']==company]['Rechnungsnummer'][0],
        "Lieferantennummer: "+master_data.loc[master_data['company']==company]['Lieferantennummer'][0],
        "Zahlungsziel: " +str((date.today().replace(day=1) - timedelta(days=1)).day)+ " Tage",
    ]
    ys = [600,590,580,570,560,550]
    width = pdf._pagesize[0]
    padding = 10 * mm
    for y, line in zip(ys, lines):
        pdf.drawRightString(width - padding, y, line)
    pdf.save()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM