我正在使用pisa从django应用程序中的html生成pdf。我的观看代码如下
if request.method == 'POST':
return write_to_pdf(request.POST['convert'], { }, 'file')
其中convert是一个TextArea,我从中获取要在我的pdf文件中写入的值
write_to_pdf
def fetch_resources(uri, rel):
path = '%s/media/pdf/' % RHOMBUS_PATH
return path
def write_to_pdf(template_data, context_dict, filename):
print template_data
template = Template(template_data)
context = Context(context_dict)
html = template.render(context)
print html
result = StringIO.StringIO()
pdf = pisa.CreatePDF(html.encode('UTF-8'), result, link_callback=fetch_resources, encoding='UTF-8')
print result.getvalue()
if not pdf.err:
response = http.HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=%s.pdf' % filename
response.write(result.getvalue())
return response
return http.HttpResponse('Problem creating PDF: %s' % cgi.escape(html))
当TextArea有像
这样的希腊强调字符时,生成的pdf会出现问题ά έ
等。我尝试改变编码但没有。任何帮助,将不胜感激。
答案 0 :(得分:2)
我也有希腊字符的问题(而不是我收到黑盒子的压力字符)。作为第一步,您需要将字体更改为正确的字体(如dejavu sans)。为此,请在html模板中添加style
元素,如下所示:
<style type='text/css'>
@font-face {
font-family: "DejaVuSansMono";
src: url("fonts/DejaVuSansMono.ttf");
}
@font-face {
font-family: "DejaVuSansMono";
src: url("fonts/DejaVuSansMono-Bold.ttf");
font-weight: bold;
}
@font-face {
font-family: "DejaVuSansMono";
src: url("fonts/DejaVuSansMono-Oblique.ttf");
font-style: italic, oblique;
}
@font-face {
font-family: "DejaVuSansMono";
src: url("fonts/DejaVuSansMono-BoldOblique.ttf");
font-weight: bold;
font-style: italic, oblique;
}
*, html {
font-family: "DejaVuSansMono";
}
html {
padding:10pt;
}
</style>
现在,dejavusans字体可以从http://dejavu-fonts.org/wiki/Main_Page下载。此外,您将放置字体文件的位置存在各种问题 - 我已经提供了对trouble in converting unicode template to pdf using xhtml2pdf的答案的一些见解。作为第一步,我建议将这些字体放在C:/fonts
(或/tmp/fonts
,如果使用unix)并使用@font-face
的绝对网址,例如
@font-face {
font-family: "DejaVuSansMono";
src: url("c:/fonts/DejaVuSansMono.ttf");
}
之后,检查我的答案,看看如何使用相对网址。
最后,我必须提到我只用dejavu-sans测试了上面的内容(并且它工作正常) - 但我真的想知道上述解决方案是否适用于其他字体,如Calibry - 如果你测试一下,请提供反馈。
如果以上操作不起作用,请查看我使用的render_to_pdf
功能:
def render_to_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, path= settings.PROJECT_PATH)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return HttpResponse('<pre>%s</pre>' % escape(html))