我正在尝试使用此代码段从模板生成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 所以根据比萨文档,我试着在样式部分的模板体中设置字体。
仍然没有结果。
有没有人有一些想法如何解决这个问题?
答案 0 :(得分:29)
这对我有用:
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')
答案 1 :(得分:3)
尝试替换
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
与
pdf = pisa.pisaDocument(StringIO.StringIO(html), result, encoding='UTF-8')
的答案
答案 2 :(得分: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文档时,这对我有用。
答案 3 :(得分:1)
我遇到了与西里尔字符相同的问题。
解决方案包含两个步骤: 1.指出HTML文件中的字体文件
<style type="text/css">
@font-face {
font-family: Arial; src: url("files/arial.ttf");
}
body {
font-family: Arial;
}
</style>
2。给&#34;比萨&#34;根路径(以便它通过相对路径找到字体文件) 就我而言,它就是这样的
pdf = pisa.pisaDocument(html, result, path=PATH_TO_DJANGO_PROJECT)
因为字体放在PATH_TO_DJANGO_PROJECT / files / arial.ttf
答案 4 :(得分:0)
如果您正在调用createPDF而不是pisaDocument方法,则可以使用
pisa.CreatePDF(html.encode('UTF-8'), response, link_callback=fetch_resources, encoding='UTF-8')
答案 5 :(得分:0)
我正在使用xhtml2pdf 0.2.4版 我遇到了同样的问题,并且能够使用以下编码进行解析:
def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
# PDF
pdf = pisa.pisaDocument(BytesIO(html.encode("utf-8")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return None
然后在我看来,我的定义如下:
def download_pdf(request, pk):
item = get_object_or_404(object, id=pk)
if item:
context ={
'item': item
}
template_name = 'template.html'
pdf = render_to_pdf(template_name, context)
return HttpResponse(pdf, content_type='application/pdf')
else:
messages.info(request, 'Item not found')
return redirect('home')
我的HTML:
{% load static %}
{% load humanize %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/gif" href="{% static 'images/profile.png' %}" />
<title>{{ item.scientific_name}}</title>
<link rel="stylesheet" href="{% static 'style/Bootstrap/css/bootstrap.min.css' %}">
<style>
@page {
size: letter;
margin: 2cm;
@frame footer_frame {
/* Another static Frame */
-pdf-frame-content: footer_content;
left: 50pt;
width: 512pt;
top: 760pt;
height: 50px;
}
table {
-pdf-keep-with-next: true;
}
}
ul {
list-style-type: none;
}
ul li span {
font-weight: bold;
}
</style>