febrero 03, 2014

ReportLab: Encoding UTF8 - Solución UnicodeDecodeError: 'utf8' (07)

El error siguiente: UnicodeDecodeError: 'utf8' codec can't decode bytes in position... 


por lo general aparece cuando leemos datos de otra fuente el cuál contiene datos en bytes, como latin-1, ANSI, estos se necesitan convertir a Unicode. Python provee tal conversión, por lo tanto la solución es inmediata.

 
En el ejemplo tenemos un texto guardado en ANSI, cuyo contenido es "Aquí un texto sin canción", en el que se produce un error al momento de dibujarlo en el canvas. Sin embargo, usando unicode(), todo se resuelve.

# -*- coding:utf-8 -*-
import os
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

c=canvas.Canvas("test.pdf", pagesize = A4)

archivo = open("texto en latin.txt", "r")
for linea in archivo:
    linea = unicode(linea, 'latin-1') #Solucionamos el problema de codificación
    c.drawString(100, 700, linea.strip())  # strip quita caracteres en blanco

c.showPage()

c.save()
os.system("test.pdf")

No hay comentarios:

Publicar un comentario