From reportlab at raf.org Mon Feb 24 21:55:59 2025 From: reportlab at raf.org (raf) Date: Tue, 25 Feb 2025 13:55:59 +1100 Subject: [reportlab-users] Please help with error in pdfbase/pdfdoc.py (TypeError: string argument expected, got 'bytes') Message-ID: Hi, macos-10.14 (old), python-3.12 (via macports), reportlab-4.3.1 (via pip) I'm converting some python2 code that uses reportlab-3.3.0 to python3 (with reportlab 4.3.1) and I'm encountering the following error: Traceback (most recent call last): File "/Users/raf/src/aps.py3/lib/./report.py", line 6196, in test_pdf_basefont report_pdf = report.pdf() ^^^^^^^^^^^^ File "/Users/raf/src/aps.py3/lib/./report.py", line 1844, in pdf self._pdf.save() File "/opt/local/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/reportlab/pdfgen/canvas.py", line 1301, in save self._doc.SaveToFile(self._filename, self) File "/opt/local/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/reportlab/pdfbase/pdfdoc.py", line 215, in SaveToFile f.write(data) TypeError: string argument expected, got 'bytes' The context of the f.write(data) file is: data = self.GetPDFData(canvas) if isUnicode(data): data = data.encode('latin1') f.write(data) So data is explictly converted from str to bytes, but https://docs.python.org/3/tutorial/inputoutput.html says: f.write(string) writes the contents of string to the file, returning the number of characters written. This looks like a bug that would always be triggered every time this code is run, but that seems unlikely. It looks like the above code should be: data = self.GetPDFData(canvas) if not isUnicode(data): data = data.decode('latin1') f.write(data) or even: data = self.GetPDFData(canvas) if not isUnicode(data): data = data.decode('utf8') f.write(data) What are your thoughts? Is this a bug in reportlab? If so, can it be fixed? If not, what might I have done to cause this? Many thanks in advance, raf From reportlab at raf.org Mon Feb 24 23:04:23 2025 From: reportlab at raf.org (raf) Date: Tue, 25 Feb 2025 15:04:23 +1100 Subject: [reportlab-users] Please help with error in pdfbase/pdfdoc.py (TypeError: string argument expected, got 'bytes') In-Reply-To: References: Message-ID: Never mind. I patched my version which seemed OK, but it wasn't. I got lots of absurd warnings about files left open that made no sense. I had some StringIO objects in my code that I was passing to reportlab somehow. Now I've changed them to BytesIO objects and things are looking good again. cheers, raf On Tue, Feb 25, 2025 at 01:55:59PM +1100, raf via reportlab-users wrote: > Hi, > > macos-10.14 (old), python-3.12 (via macports), reportlab-4.3.1 (via pip) > > I'm converting some python2 code that uses reportlab-3.3.0 > to python3 (with reportlab 4.3.1) and I'm encountering the > following error: > > Traceback (most recent call last): > File "/Users/raf/src/aps.py3/lib/./report.py", line 6196, in test_pdf_basefont > report_pdf = report.pdf() > ^^^^^^^^^^^^ > File "/Users/raf/src/aps.py3/lib/./report.py", line 1844, in pdf > self._pdf.save() > File "/opt/local/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/reportlab/pdfgen/canvas.py", line 1301, in save > self._doc.SaveToFile(self._filename, self) > File "/opt/local/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/reportlab/pdfbase/pdfdoc.py", line 215, in SaveToFile > f.write(data) > TypeError: string argument expected, got 'bytes' > > The context of the f.write(data) file is: > > data = self.GetPDFData(canvas) > if isUnicode(data): > data = data.encode('latin1') > f.write(data) > > So data is explictly converted from str to bytes, but > https://docs.python.org/3/tutorial/inputoutput.html > says: > > f.write(string) writes the contents of string to the > file, returning the number of characters written. > > This looks like a bug that would always be triggered > every time this code is run, but that seems unlikely. > It looks like the above code should be: > > data = self.GetPDFData(canvas) > if not isUnicode(data): > data = data.decode('latin1') > f.write(data) > > or even: > > data = self.GetPDFData(canvas) > if not isUnicode(data): > data = data.decode('utf8') > f.write(data) > > What are your thoughts? Is this a bug in reportlab? > If so, can it be fixed? > If not, what might I have done to cause this? > > Many thanks in advance, > raf > > _______________________________________________ > reportlab-users mailing list > reportlab-users at lists2.reportlab.com > https://pairlist2.pair.net/mailman/listinfo/reportlab-users