Python3 Django - > HTML到PDF

时间:2014-11-18 14:42:37

标签: python django pdf html-to-pdf

在python2中,有很多不同的方法可以从django网页生成pdf。最干净的可能是比萨和报告。 但这些对python3不起作用。

到目前为止,我唯一成功的方法是渲染模板,将其写入文件,然后通过subprocess.popen使用wkhtmltopdf。这没关系,但它不会加载我的任何静态文件,例如css和图像。

有没有合适的解决方案?可以wkhtmltopdf从命令行读取我的静态文件,在某种程度上,还是有像pisa / reportlab这样的库,它支持python3?

我还没能找到这样的图书馆

4 个答案:

答案 0 :(得分:10)

您可以使用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为止。所以考虑使用ASYNC Worker。

答案 1 :(得分:1)

我查看了Weasyprint,wkhtmltopdf甚至是LaTeX,但都有外部二进制依赖,很难部署到Heroku等服务。

到目前为止,我发现在Python 3上使用Django的最佳组合是使用Reportlab(现在适用于Python 3)+ xhtml2pdf。 xhtml2pdf最近才添加了beta Python 3支持,所以你需要安装它:

pip install --pre xhtml2pdf

如果你安装了这两个,你可以直接使用xhtml2pdf,也可以安装提供TemplateView继承的django-easy-pdf包,以及一个示例基本模板&造型让你快速入门。按照他们的快速入门说明操作,您可以快速准备类似于详细视图的内容,如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')

答案 2 :(得分:0)

wkhtmltopdf需要

  • 要内联的CSS
  • 本地存在于服务器上的静态文件
  • 静态文件网址为os路径,例如:/home/ubuntu/project/project/static/file_name

答案 3 :(得分:0)

我在Python3中尝试了pydf,它的工作正常。

pip install python-pdf

python2使用pip install python-pdf==0.30.0

文档https://github.com/tutorcruncher/pydf