有没有办法从Django模板使用Pisa生成包含非ASCII符号的PDF?
我正在尝试用这个代码片段从模板生成一个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,所以根据pisa的文档,我尝试在模板的样式部分设置字体。
但这样还是没有效果。
有没有人有什么想法可以解决这个问题?
6 个回答
2
你需要修改你的Django模板。在样式表中添加一个新的字体,这个字体要链接到一个包含你文档中使用的字符的字体文件。而这个字体文件必须能从你的服务器上访问到(在Ubuntu系统中,你可以在/usr/share/fonts/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文档时,这样做对我有效。
4
试着把
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
换成
pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')
或者看看这个回答,关于如何将HTML转换为Django网站的PDF?
31
这个对我有效:
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')