'list' object has no attribute 'decode' bei der PDF Erstellung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PythonCodingFun
User
Beiträge: 49
Registriert: Mittwoch 22. September 2021, 14:01

Hallo,

ich möchte aus Informationen einer Datenbank ein PDF mit Hilfe von reportlab erstellen. Dazu habe ich mir folgendes geschrieben:

Code: Alles auswählen


from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from io import BytesIO

def generate_pdf(text: str):
    try:
        buffer = BytesIO()
        can = canvas.Canvas(buffer, pagesize=A4)

        wraped_text = "\n".join(wrap((text)) # Damit ich den Text nicht über die Seite hinausragt
        can.drawString(300, 600, wraped_text.splitlines()) 
        can.save()

    except Exception as e:
        # ....
        
Da die Texte häufig Umlaute enthalten, bekam ich im unittest die folgende Meldung:

Code: Alles auswählen

AttributeError: asUnicode(['Text, usw.....'],enc='utf8') error:  'list' object has no attribute 'decode'
Ich suchte im Netz nach dem Problem wurde zwar fündig aber encode("'utf-8'") bzw. decode("'utf-8'") halfen leider nicht :?



Über konstruktive Hilfe würde ich mich sehr freuen :)

Danke
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie kommst Du auf die Idee, dass man drawString eine Liste übergeben kann?
PythonCodingFun
User
Beiträge: 49
Registriert: Mittwoch 22. September 2021, 14:01

Sirius3 hat geschrieben: Dienstag 30. Mai 2023, 10:33 Wie kommst Du auf die Idee, dass man drawString eine Liste übergeben kann?
Ich denke ich weiß worauf Du hinaus willst,

habe es mal so abgeändert

Code: Alles auswählen

#.....
wraped_text = "\n".join(wrap(text,10))
        t = can.beginText()
        t.setTextOrigin(300,600)
        t.textLine(wraped_text)
        can.drawText(t)
        #....
        
Aber leider sehe ich jetzt schwarze Quadrate auf dem PDF, statt das eine neue Zeile begonnen wird.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PythonCodingFun: Mal davon abgesehen, das `drawText()` keine Liste nimmt — warum denn bitte erst die Zeilen mit ``"\n".join(…)`` zusammenfügen um dann gleich wieder mit `splitlines()` eine Liste daraus machen‽

`textLine()` kann keine Steuerzeichen und das setzt wie der Name vermuten lassen sollte *eine* Textzeile. Schau doch mal was `PDFTextObject` noch so an Methoden hat.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
PythonCodingFun
User
Beiträge: 49
Registriert: Mittwoch 22. September 2021, 14:01

Ich glaube jetzt bin ich auf dem richtigen Weg, glaube ich ;)

Auszug aus textobject.py

Code: Alles auswählen

   def textLines(self, stuff, trim=1):
        """prints multi-line or newlined strings, moving down.  One
        comon use is to quote a multi-line block in your Python code;
        since this may be indented, by default it trims whitespace
        off each line and from the beginning; set trim=0 to preserve
        whitespace."""
Antworten