Solución a error de decode en combinación Python QT PyQT ReportLab – AttributeError: ‘QString’ object has no attribute ‘decode’

El sistema Komunal que desarrolle en el 2013 usando Python, QT4, PyQT4 y SQLite con el código disponible en GitHub: https://github.com/leninmhs/komunal hoy probándolo no generaba los PDF. Para generar los pdf desde python use ReportLab que es excelente solución para esta tarea. En su momento cuando publique el código en GitHub los pdf se exportaban sin problema, hoy volviendo a levantar ese código fallaba intentando guardar el archivo pdf, el error fue el siguiente:

File «/usr/lib/python2.7/dist-packages/reportlab/lib/utils.py», line 1395, in makeFileName
s = s.decode(‘utf8’)
AttributeError: ‘QString’ object has no attribute ‘decode’

La ejecución completa:

leninmhs@debian:~/komunal$ python inicial.py
Gtk-Message: Failed to load module «canberra-gtk-module»
SQLite cargado
QFont::setPointSize: Point size <= 0 (-1), must be greater than 0
SQLite cargado
Aqui en pdf indicadores
Traceback (most recent call last):
File «/home/leninmhs/komunal/indicadores.py», line 139, in generarReporteIndicadores
doc.build( story )
File «/usr/lib/python2.7/dist-packages/reportlab/platypus/doctemplate.py», line 1127, in build
BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker)
File «/usr/lib/python2.7/dist-packages/reportlab/platypus/doctemplate.py», line 916, in build
self._endBuild()
File «/usr/lib/python2.7/dist-packages/reportlab/platypus/doctemplate.py», line 858, in _endBuild
if getattr(self,’_doSave’,1): self.canv.save()
File «/usr/lib/python2.7/dist-packages/reportlab/pdfgen/canvas.py», line 1209, in save
self._doc.SaveToFile(self._filename, self)
File «/usr/lib/python2.7/dist-packages/reportlab/pdfbase/pdfdoc.py», line 215, in SaveToFile
filename = makeFileName(filename)
File «/usr/lib/python2.7/dist-packages/reportlab/lib/utils.py», line 1395, in makeFileName
s = s.decode(‘utf8’)
AttributeError: ‘QString’ object has no attribute ‘decode’

la solución fue evitar que necesitara usar el decode utf8, entonces use en mi codigo:

unicode( variabletexto, «utf-8»)

cambiando entonces:

[sourcecode language=»python»]
style=styleSheet[‘BodyText’]
doc=SimpleDocTemplate( pdf_x_indicador ,pagesize=letter,leftMargin=10, rightMargin=10, topMargin=10, bottomMargin=10, title="Komunal – Reporte de Indicadores", author= "Komunal Beta" )
doc.build( story )
[/sourcecode]

por

[sourcecode language=»python»]
style=styleSheet[‘BodyText’]
doc=SimpleDocTemplate( unicode( pdf_x_indicador, "utf-8") ,pagesize=letter,leftMargin=10, rightMargin=10, topMargin=10, bottomMargin=10, title="Komunal – Reporte de Indicadores", author= "Komunal Beta" )
doc.build( story )
[/sourcecode]

 

Ciertamente caso extraño, todo en el sistema esta en utf8, fue desarrollado integro en entorno Linux y en efecto cada archivo .py su segunda linea es # -*- coding: utf-8 -*-

El cambio ya disponible en GitHub…

PD: por si hay dudas pdf_x_indicador es:

[sourcecode language=»python»]
pdf_x_indicador = QtGui.QFileDialog.getSaveFileName(self, "Guardar Planilla Komunal (*.pdf)", QtCore.QDir.homePath() + "/indicadores-komunal.pdf", "Documento PDF (*.pdf)")
[/sourcecode]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *