【问题标题】:Django - Pisa generated pdf doesn't have spacesDjango - 比萨生成的 pdf 没有空格
【发布时间】:2011-09-11 17:15:55
【问题描述】:

我正在使用 Django,我的代码渲染 PDF 非常典型:

t = loader.get_template('back/templates/content/receipt.html')
c = RequestContext(request, {
                             'pagesize': 'A4',
                             'invoice': invoice,
                             'plan': plan,
                             })

html = t.render(c)
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result)
if not pdf.err:
    return HttpResponse(result.getvalue(), mimetype="application/pdf")

receipt.html 也没什么异常:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Squizzal Receipt</title>
    <style type="text/css">
        @page {
            size: {{pagesize}};
            margin: 1cm;
            word-spacing 1cm;
            @frame footer {
                -pdf-frame-content: footerContent;
                bottom: 0cm;
                margin-left: 9cm;
                margin-right: 9cm;
                height: 1cm;
            }
        }
    </style>
</head>
<body>
    <h1>Your Receipt</h1>
   <<SNIP>>

但不会呈现 pdf 中的任何空格。所有的词都紧挨着。我试过普通空格和“&nbsp”,结果是一样的。例如,以上内容在 pdf 中将显示为“YourReceipt”。

当我尝试使用 pisa 的命令行版本时,它生成的 pdf 文件很好,单词之间有空格。

有什么想法吗?

【问题讨论】:

  • 将 t.render(c).encode("UTF-8") 的 HTML 输出保存到一个文件中,并将该文件提供给命令行版本。它产生什么?
  • html 文件符合预期,将该文件传递到 cmd 行 pisa 会产生预期结果。目前我正在使用 django 开发服务器对此进行测试,但我也在 apache 上使用 wsgi 对其进行了测试。我想不出还有什么可能会影响到这一点。
  • 尝试将 pisa.pisaDocument() 的结果保存到文件中并在 PDF 查看器中打开该文件。没事吧?
  • 所以我不明白这一点。如果我这样做: pdf = pisa.CreatePDF(html.encode("UTF-8"), file("test.pdf", "wb")) 它会创建一个好的文件(带空格)。但是当我将 StringIO 结果对象传递给它并执行以下操作时: return HttpResponse(result.getvalue(), mimetype="application/pdf") 空格被剥离。 StringIO 是否对流进行处理?
  • pisaDocument 和 CreatePDF 产生相同的结果。我认为它必须与StringIO有关。我也试过 StringIO 和 cStringIO...同样的结果。

标签: django pisa


【解决方案1】:

我遇到了同样的问题,不想强制从浏览器下载 PDF。结果证明这是一个特定于平台的问题:当未安装 Microsoft TrueType 字体时,Google Chrome 的本机 PDF 查看器插件无法在某些 Linux 发行版上的某些文档中呈现空格。详情请见http://www.google.com/support/forum/p/Chrome/thread?tid=7169b114e8ea33c7&hl=en

我通过简单地在 bash 中运行以下命令来解决此问题(根据您的发行版进行调整;这是在 Ubuntu 上):

$ sudo apt-get install msttcorefonts

(在安装过程中接受 EULA)

$ fc-cache -fv

重新启动 Chrome 后(重要!),本机 PDF 查看器正确显示带有空格的 PDF。

【讨论】:

    【解决方案2】:

    好的,感谢 akonsu,问题似乎是如何处理 Django 的 HttpResponse(在服务器端或浏览器端)。

    代替

     return HttpResponse(result.getvalue(), mimetype="application/pdf")
    

    用途:

     resp = HttpResponse(result.getvalue(), mimetype="application/pdf")
     resp['Content-Disposition'] = 'attachment; filename=receipt.pdf'
     return resp
    

    这至少会产生一个没有空格的结果。仍然不知道为什么第一种方法不起作用。

    【讨论】:

    • 你想达到什么效果?当您导航到 url 时,应该内嵌显示 PDF 还是浏览器打开“另存为”对话框?顺便说一句,您是否设置了内容长度标头?也许这就是导致问题的原因?
    • @Alanyst 的回答实际上是正确的。强制下载文件时问题未解决,因为问题是谷歌浏览器的 pdf 查看器无法正确呈现 pdf。设置内容配置和强制下载只是回避了问题。
    • @mark 我在使用你的解决方案后仍然有问题,有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多