3

我正在使用 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 虽然有问题,例如

ά έ 

等我尝试更改编码但没有。任何帮助,将不胜感激。

4

1 回答 1

3

我也遇到了希腊字符的问题(而不是我收到黑匣子的强调字符)。作为第一步,您需要将字体更改为正确的字体(如 dejavu sans)。为此,请style向您的 html 模板添加一个元素,如下所示:

<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>

现在,可以从http://dejavu-fonts.org/wiki/Main_Page下载 dejavusans 字体。此外,您将放置字体文件的位置存在各种问题 - 我对使用 xhtml2pdf 将 unicode 模板转换为 pdf 时遇到的麻烦提供了一些见解。作为第一步,我建议将这些字体放入C:/fonts(或者/tmp/fonts如果使用 unix)并使用绝对 url @font-face,例如

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

之后,查看我的答案以了解如何使用相对 url。

最后,我不得不提一下,我只用 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))
于 2013-12-23T10:31:30.533 回答