有没有一种方法来生成包含从Django的模板比萨非ASCII符号PDF?(Is there a wa

2019-09-01 23:33发布

我试图用这个片段来从模板PDF格式:

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

所有非拉丁符号显示不正确,模板和视图使用UTF-8编码保存的。

我试着节约观为ANSI再返回到用户的Unicode(HTML,“UTF-8”),但它抛出类型错误。

此外,我想,也许这是因为默认字体不知何故不支持UTF-8,以便根据比萨文档我试图设置在模板体fontface在样式部分。

这仍然没有给出结果。

没有任何一个有一些想法如何解决这个问题?

Answer 1:

这确实为我工作:

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


Answer 2:

尝试更换

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

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

或检出这个答案HTML到PDF的Django的网站?



Answer 3:

您需要修改你的Django模板。 在将链接到的字体文件在文档中使用的字符样式表中添加新字体。 和字体文件必须是从服务器访问(在Ubuntu下,你可以找到文件使用字体在/ usr /共享/字体/ TrueType字体/目录)。 例如:

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

然后,如果你有未来的HTML代码:

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

您可以显示在这个CSS规则DejaMono字体,文本:

div { font-family: DejaMono; }

这对我的作品时,我产生与西里尔字符的PDF文档。



Answer 4:

我用西里尔字符所面临的同样的问题。

该解决方案包含两个步骤:在您的HTML文件1.指出字体文件

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

2.给“比萨”根路径(以便找到相对路径字体文件)在我的情况是这样的

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

因为字体被放置在PATH_TO_DJANGO_PROJECT /文件/ ARIAL.TTF



Answer 5:

如果要调用createPDF代替pisaDocument方法,你可以使用

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


文章来源: Is there a way to generate pdf containing non-ascii symbols with pisa from django template?