2009-10-28 14 views
17

estoy tratando de generar un PDF a partir de plantilla utilizando este fragmento:¿Hay alguna manera de generar un pdf que contenga símbolos que no sean ascii con pisa de la plantilla django?

def write_pdf(template_src, context_dict): 
    template = get_template(template_src) 
    context = Context(context_dict) 
    html = template.render(context) 
    result = StringIO.StringIO() 
    pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result) 
    if not pdf.err: 
     return http.HttpResponse(result.getvalue(), mimetype='application/pdf') 
    except Exception('PDF error') 

Todos los símbolos no latinos no se muestran correctamente, la plantilla y la vista se guardan con codificación UTF-8.

He intentado guardar la vista como ANSI y luego como usuario unicode (html, "UTF-8"), pero arroja TypeError.

También pensé que tal vez es porque las fuentes predeterminadas de alguna manera no son compatibles con utf-8 por lo que de acuerdo con la documentación de pisa intenté establecer fontface en el cuerpo de la plantilla en la sección de estilo.

Eso todavía no dio ningún resultado.

¿Alguien tiene algunas ideas sobre cómo solucionar este problema?

Respuesta

28

Esto funciona para mí:

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8') 
3

intentar sustituir

pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result) 

con

pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8') 

o Checkout esta respuesta a html to pdf for a Django site?

+1

después replaceing consiguió pdf completo de datos ilegibles, comprueba la solución, el método no difiere mucho de lo que yo uso, pero todavía probado, con html.encode ("ISO-8859-1") se throws: "'latin-1' códec no puede codificar el carácter u '\ ufeff' en la posición 0: ordinal no en el rango (256)" con codificación ("UTF-8") devuelve pdf pero igual que yo he recibido previamente: los símbolos que no son ascii aún no se representan correctamente. – mihailt

+0

@mihailt ¿Has encontrado una solución? –

+0

exactamente agregando esto: 'encoding = 'UTF-8'' resolvió mi problema con la codificación de caracteres polaco – andi

2

Usted necesita modificar su Djan ir plantilla. Agregue una nueva cara de fuente en la hoja de estilo que se vinculará a un archivo de fuente con los caracteres utilizados en su documento. Y ese archivo de fuente debe ser accesible desde su servidor (en Ubuntu puede encontrar archivos con fuentes en/usr/share/fonts/truetype/directory). Por ejemplo:

@font-face { 
    font-family: DejaMono; 
    src: url(font/DejaVuSansMono.ttf); 
} 

Entonces, si usted tiene el próximo código HTML:

<div>Some non-latin characters</div> 

puede visualizar el texto en fuente DejaMono con esta regla CSS:

div { font-family: DejaMono; } 

Esto funciona para mí cuando Genero documentos PDF con caracteres cirílicos.

0

Si llama CreatePDF en lugar del método pisaDocument, puede utilizar

pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8') 
1

que enfrentan el mismo problema con caracteres cirílicos.

La solución contenía dos pasos: 1. Punto el archivo fuente en el archivo HTML

2. Dar ruta raíz "pisa" (de modo que encontrar archivo de fuente de ruta relativa) en mi caso fue algo como esto

pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT) 

porque las fuentes se colocaron en PATH_TO_DJANGO_PROJECT/files/Arial.ttf

Cuestiones relacionadas