将pdf从django-wkhtmltopdf保存到服务器(而不是作为回复返回)

时间:2015-09-11 05:50:14

标签: django pdf wkhtmltopdf

我正在编写一个Django函数,它接受一些用户输入,并为用户生成pdf。但是,生成pdf的过程非常密集,我会收到很多重复的请求,所以我想将生成的pdf存储在服务器上,并在生成之前检查它们是否已经存在。

问题是django-wkhtmltopdf(我用于生成)是为了直接返回给用户,我不知道如何将它存储在文件中。

我有以下内容,适用于在/ pdf中返回pdf:

urls.py

urlpatterns = [
    url(r'^pdf$', views.createPDF.as_view(template_name='site/pdftemplate.html', filename='my_pdf.pdf'))
]

views.py

class createPDF(PDFTemplateView):
    filename = 'my_pdf.pdf'
    template_name = 'site/pdftemplate.html'

这样可以很好地创建一个pdf。我想要的是从另一个视图调用该视图并保存结果。这是我到目前为止所得到的:

#Create pdf
pdf = createPDF.as_view(template_name='site/pdftemplate.html', filename='my_pdf.pdf')
pdf = pdf(request).render()

pdfPath = os.path.join(settings.TEMP_DIR,'temp.pdf')
with open(pdfPath, 'w') as f:
    f.write(pdf.content)

这会创建temp.pdf并且大小与我期望的大小相同,但文件无效(它呈现为一个完全空白的页面)。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

详细说明上一个答案:生成pdf文件并保存到磁盘在视图中的任何位置执行此操作:

            ...
            context = {...}  # build your context

            # generate response
            response = PDFTemplateResponse(
                            request=self.request,
                            template=self.template_name,
                            filename='file.pdf',
                            context=context,
                            cmd_options={'load-error-handling': 'ignore'})

            # write the rendered content to a file
            with open("file.pdf", "wb") as f:
                f.write(response.rendered_content)
            ...

我在TemplateView类中使用了此代码,因此requesttemplate字段设置如此,您可能必须将其设置为适合您特定情况的任何内容。

答案 1 :(得分:1)

嗯,您需要查看wkhtmltopdf的代码,首先需要使用 wkhtmltopdf.views 中的 PDFTemplateResponse 类来访问 rendered_content 属性,此属性使我们可以访问pdf文件:

response = PDFTemplateResponse(
        request=<your_view_request>,
        template=<your_template_to_render>,
        filename=<pdf_filename.pdf>,
        context=<a_dcitionary_to_render>,
        cmd_options={'load-error-handling': 'ignore'})

现在您可以使用 rendered_content 属性来访问pdf文件:

 mail.attach('pdf_filename.pdf', response.rendered_content, 'application/pdf')

在我的情况下,我使用此pdf附加到电子邮件,您可以存储它。