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

The*_*lar 5 pdf django wkhtmltopdf

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

问题是 django-wkhtmltopdf(我用于生成)旨在直接返回给用户,我不确定如何将其存储在文件中。

我有以下内容,可用于在 /pdf 处返回 pdf:

网址.py

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

视图.py

class createPDF(PDFTemplateView):
    filename = 'my_pdf.pdf'
    template_name = 'site/pdftemplate.html'
Run Code Online (Sandbox Code Playgroud)

所以这可以很好地创建一个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)
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Lui*_*ufe 2

好吧,你需要看一下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'})
Run Code Online (Sandbox Code Playgroud)

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

 mail.attach('pdf_filename.pdf', response.rendered_content, 'application/pdf')
Run Code Online (Sandbox Code Playgroud)

就我而言,我使用此 pdf 附加到电子邮件,您可以存储它。