使用Python将HTML转换为PDF

4 投票
4 回答
10864 浏览
提问于 2025-04-17 03:16

我正在尝试在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其实并不算太难。

网上有很多例子可以教你怎么做,并且解释了如何在你的模板中链接外部资源:

在你的情况下,你可以尝试第一个博客文章中提到的链接回调函数:

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

撰写回答