Is there a way to generate pdf containing non-ascii symbols with pisa from django template?

六月ゝ 毕业季﹏ 提交于 2019-12-04 08:58:58

问题


I'm trying to generate a pdf from template using this snippet:

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')

All non-latin symbols are not showing correctly, the template and view are saved using utf-8 encoding.

I've tried saving view as ANSI and then to user unicode(html,"UTF-8"), but it throws TypeError.

Also I thought that maybe it's because the default fonts somehow do not support utf-8 so according to pisa documentation I tried to set fontface in template body in style section.

That still gave no results.

Does any one have some ideas how to solve this issue?


回答1:


This does work for me:

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



回答2:


Try replacing

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

with

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

Or checkout this answer to html to pdf for a Django site?




回答3:


You need to modify your django template. Add a new font face in the stylesheet that will link to a font file with characters used in your document. And that font file must be accessible from your server (under Ubuntu you can find files with fonts in /usr/share/fonts/truetype/ directory). For example:

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

Then if you have next HTML code:

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

you can display that text in DejaMono font with this CSS rule:

div { font-family: DejaMono; }

This works for me when I generate PDF documents with cyrillic characters.




回答4:


I faced the same problem with cyrillic characters.

The solution contained two steps: 1. Point out the font file in your HTML file

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

2. Give "pisa" root path (so that it find font file by relative path) in my case it was something like this

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

because fonts were placed at PATH_TO_DJANGO_PROJECT/files/arial.ttf




回答5:


If you are calling createPDF instead of the pisaDocument method, you can use

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


来源:https://stackoverflow.com/questions/1637229/is-there-a-way-to-generate-pdf-containing-non-ascii-symbols-with-pisa-from-djang

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!