使用Python将HTML转换为PDF
我正在尝试在Django中将HTML转换成PDF文档,但一直没有成功。
我试过使用wkhtmltopdf 0.9.9,但Apache报错说wkhtmltopdf无法连接到服务器。当我直接使用wkhtmltopdf时,它运行得很好,可以把HTML转换成PDF文档。
我还尝试过使用unoconv,但生成的PDF文件没有任何CSS样式。我也试过使用xhtml2pdf,结果也是一样;生成的PDF文件没有应用任何CSS样式。我今天和昨晚大部分时间都在尝试解决这个问题,但还是没有找到解决办法。
如果你需要更多信息,请告诉我。
4 个回答
0
我建议你使用pisa、pypdf和html5lib这几个工具组合,这对我来说很有效。
0
一个可能的,但不太优雅的解决办法是,运行一个小脚本,通过一个无头浏览器组件(在Linux上可以用webkit/xvfb)来生成HTML,然后把它保存为PDF文件。
4
为Django配置Pisa其实并不算太难。
网上有很多例子可以教你怎么做,并且解释了如何在你的模板中链接外部资源:
- http://www.arnebrodowski.de/blog/501-Pisa-and-Reportlab-pitfalls.html
- django - pisa : 向PDF输出添加图片
- http://antydba.blogspot.com/2009/12/django-pisa-polskie-czcionki.html
- http://www.20seven.org/journal/2008/11/pdf-generation-with-pisa-in-django.html
在你的情况下,你可以尝试第一个博客文章中提到的链接回调函数:
def fetch_resources(uri, rel):
"""
Callback to allow pisa/reportlab to retrieve Images,Stylesheets, etc.
`uri` is the href attribute from the html link element.
`rel` gives a relative path, but it's not used here.
"""
path = os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, ""))
return path
对于较新的Django版本,你可能应该使用 STATIC_ROOT
而不是 MEDIA_ROOT
然后在你的渲染方法中相应地使用 fetch resources
:
pdf = pisa.pisaDocument(StringIO.StringIO(
html.encode("UTF-8")),
result,
link_callback=fetch_resources,
encoding="utf-8")