2009-10-28 13 views
17

我试图用这个片段来生成模板PDF:有没有办法使用django模板生成包含非ASCII字符的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”),但它会引发TypeError。

另外我想也许这是因为默认字体莫名其妙地不支持utf-8 ,所以根据比萨文档,我尝试在样式部分设置模板体中的fontface。

这仍然没有结果。

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

回答

28

这确实对我的工作:

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

尝试

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

或校验这个答案更换

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

html to pdf for a Django site?

+1

替换后得到pdf完整的不可读数据, 检查了解决方案,该方法与我使用的没有多大差别,但我仍然使用html.encode(“ISO-8859-1”)对其进行测试抛出: “拉丁-1”编解码器无法编码字符u'\ ufeff'在位置0:序号不在范围(256)“ 与编码(”UTF-8“)它返回pdf,但与我一样之前有过 - 非ascii符号仍然没有正确渲染。 – mihailt 2009-10-28 13:51:09

+0

@mihailt你找到了解决方案吗? – 2014-05-09 20:05:46

+0

正好加上这个:'encoding ='UTF-8''解决了我编码波兰字符的问题 – andi 2014-08-22 20:58:00

2

您需要修改djan去模板。在样式表中添加一个新的字体,该字体将链接到包含文档中使用字符的字体文件。该字体文件必须可以从您的服务器访问(在Ubuntu下,您可以在/ usr/share/fonts/truetype /目录中找到包含字体的文件)。例如:

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

然后,如果你有下一个HTML代码:

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

,您可以显示DejaMono字体,文字与此CSS规则:

div { font-family: DejaMono; } 

这对我的作品的时候我用西里尔字符生成PDF文档。

0

如果您呼叫createPDF代替pisaDocument方法,你可以使用

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

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

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

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

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

因为字体放在PATH_TO_DJANGO_PROJECT/files/arial。ttf

相关问题