在python2中,有很多不同的方法可以从django网页生成pdf。最干净的可能是比萨和报告。 但这些对python3不起作用。
到目前为止,我唯一成功的方法是渲染模板,将其写入文件,然后通过subprocess.popen使用wkhtmltopdf。这没关系,但它不会加载我的任何静态文件,例如css和图像。
有没有合适的解决方案?可以wkhtmltopdf从命令行读取我的静态文件,在某种程度上,还是有像pisa / reportlab这样的库,它支持python3?
我还没能找到这样的图书馆
答案 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需要
/home/ubuntu/project/project/static/file_name
答案 3 :(得分:0)