2011-09-11 39 views
1

我使用Django和我的代码来渲染PDF实在是典型的: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”。

当我尝试使用命令行版本的比萨时,它生成的PDF就好了,单词之间有空格。

有什么想法?

+0

将t.render(c).encode(“UTF-8”)的HTML输出保存到文件中,并将该文件提供给命令行版本。它产生了什么? – akonsu

+0

html文件与预期的一样,并将该文件传递到cmd行比萨可产生预期结果。目前我正在使用django开发工具测试这个,但我也用apache上的wsgi测试了它。我想不出任何可能影响到这一点的事情。 – Mark

+0

尝试将pisa.pisaDocument()的结果保存到文件中并在PDF查看器中打开该文件。可以吗? – akonsu

回答

0

好的感谢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 

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

+0

你想达到什么效果?应该将PDF内联显示,还是浏览到url时浏览器是否打开“另存为”对话框?顺便说一句,你是否设置了内容长度标题?也许这是什么原因造成的问题? – akonsu

+2

@ Alanyst的答案其实是正确的。这个问题在强制下载文件时没有解决,因为问题是谷歌浏览器的pdf查看器无法正确呈现PDF。设置内容处置和强制下载只是侧重解决问题。 –

+0

@mark我甚至在使用你的解决方案后,仍然有问题,任何修复? – laycat

4

我有这个相同的问题,并不想强制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。