有没有办法从Django模板使用Pisa生成包含非ASCII符号的PDF?

20 投票
6 回答
11296 浏览
提问于 2025-04-15 15:27

我正在尝试用这个代码片段从模板生成一个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')

撰写回答