Python3 Django -> HTML转PDF

10

有很多种方法可以在Python2中从Django网页生成PDF文件。其中最简洁的可能是使用Pisa和Reportlab。但是这些方法无法在Python3中运行。

迄今为止,我唯一成功的方法是渲染模板,将其写入文件,然后通过subprocess.popen使用wkhtmltopdf。这个方法还算可以,但它不会加载任何静态文件,如CSS和图像。

是否有适当的解决方案? wkhtmltopdf能否从命令行读取我的静态文件,或者是否有像pisa / reportlab这样支持Python3的库?

我还没有找到这样的库。

4个回答

13
你可以使用Weasyprint,直接进行渲染。你可以像这样做:
    html = HTML(string=htmlstring)
    main_doc = html.render()
    pdf = main_doc.write_pdf()
    return HttpResponse(pdf, content_type='application/pdf')

要将您的Django视图呈现为HTML,您可以简单地使用快捷方式render_to_string(self.template_name, context, context_instance=RequestContext(self.request))

请注意,在使用同步Web服务器/WSGI服务器时,所有请求都将被阻塞,直到PDF呈现完成。因此,请考虑使用异步工作者。


谢谢您!这是我在搜索中没有发现的,但它完美地解决了问题。安装它需要一些努力,因为它需要一些非Python库,但我成功了。非常感谢! - Eldamir
我尝试使用Weasyprint,它可以在Python3中工作,但是它会消耗大量的内存 - 从不到1M的HTML生成PDF需要500M。 - asafm

6
我研究了Weasyprint、wkhtmltopdf甚至LaTeX,但它们都有外部二进制依赖项,很难部署到像Heroku这样的服务中。
到目前为止,在Python 3上运行Django的最佳组合是使用Reportlab(现在支持Python 3)+xhtml2pdf。xhtml2pdf最近才添加了beta Python 3支持,因此您需要使用以下命令安装:
pip install --pre xhtml2pdf

如果您已经安装了这两个软件,您可以直接使用xhtml2pdf,或者安装django-easy-pdf包,该包提供了一个TemplateView来继承和一个示例基础模板和样式,以便快速入门。按照其快速入门说明,您可以快速准备类似于详细视图的内容,并将其呈现为PDF,例如:
class InvoicePDFView(PDFTemplateView):
    template_name = "invoice_pdf.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        myinstance = get_object_or_404(MyModel, pk=context['pk'])
        context['myinstance'] = myinstance
        return context

在你的 urls.py 文件中,你需要添加类似以下的内容:

url(r'invoice/(?P<pk>[^/]+)/$', InvoicePDFView.as_view(), name='invoice')

0

wkhtmltopdf需要

  • 将CSS内联
  • 在服务器上本地存在静态文件
  • 静态文件URL必须是操作系统路径,例如:/home/ubuntu/project/project/static/file_name

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接