Seite 1 von 1

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

Verfasst: Dienstag 30. Mai 2023, 10:12
von PythonCodingFun
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

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

Verfasst: Dienstag 30. Mai 2023, 10:33
von Sirius3
Wie kommst Du auf die Idee, dass man drawString eine Liste übergeben kann?

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

Verfasst: Dienstag 30. Mai 2023, 11:02
von PythonCodingFun
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.

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

Verfasst: Dienstag 30. Mai 2023, 11:44
von __blackjack__
@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.

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

Verfasst: Dienstag 30. Mai 2023, 11:59
von PythonCodingFun
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."""