¿Hay alguna manera de generar pdf que contenga símbolos no ascii con pisa de la plantilla django?

StackOverflow https://stackoverflow.com/questions/1637229

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de generar un pdf desde la plantilla usando este fragmento:

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 usando la codificación utf-8.

Intenté guardar la vista como ANSI y luego usar unicode de usuario (html, & UTF-8), pero arroja TypeError.

También pensé que tal vez sea porque las fuentes predeterminadas de alguna manera no son compatibles con utf-8 así que de acuerdo con la documentación de pisa, intenté configurar fontface en el cuerpo de la plantilla en la sección de estilo.

Eso todavía no dio resultados.

¿Alguien tiene alguna idea de cómo resolver este problema?

¿Fue útil?

Solución

Esto funciona para mí:

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

Otros consejos

Intenta reemplazar

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

con

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

O consulte esta respuesta a html a pdf para un Django sitio?

Necesita modificar su plantilla de django. Agregue una nueva 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 el directorio / usr / share / fonts / truetype /). Por ejemplo:

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

Entonces, si tiene el siguiente código HTML:

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

puede mostrar ese texto en la fuente DejaMono con esta regla CSS:

div { font-family: DejaMono; }

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

Me enfrenté al mismo problema con los caracteres cirílicos.

La solución contenía dos pasos: 1. Señale el archivo de fuente en su archivo HTML

<style type="text/css">
@font-face {
  font-family: Arial; src: url("files/arial.ttf");
}
body {
  font-family: Arial;
}
</style>

2. Dale "pisa" ruta raíz (para que encuentre el archivo de fuente por 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

Si está llamando a createPDF en lugar del método pisaDocument, puede usar

pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top