dgu*_*uay 7 python pdf django wkhtmltopdf
我正在使用wkhtmltopdf包装器在Django 1.6中将模板生成为PDF.当我想在之后显示PDF或发送带有HttpResponse的PDF文件进行下载时它工作正常,但我想要做的是在我的tmp文件夹中创建文件并将其附加到电子邮件中.
我不知道如何实现这一目标.
# views.py
context = {
'products_dict': products_dict,
'main_categories': main_categories,
'user_category': user_category
}
response = PDFTemplateResponse(request=request,
context=context,
template="my_template.html",
filename="filename.pdf",
show_content_in_browser=True,
cmd_options={'encoding': 'utf8',
'quiet': True,
'orientation': 'landscape',
}
)
return response
Run Code Online (Sandbox Code Playgroud)
上面的代码生成了我想要的PDF.问题是我不想在浏览器中显示PDF或开始下载(我不想返回响应).我只是想创建它,然后将文件附加到这样的电子邮件:
email = EmailMessage()
email.subject = "subject"
email.body = "Your PDF"
email.from_email = "sender@gmail.com"
email.to = [ "receiver@gmail.com", ]
# Attach PDF file to the email
email.attach_file(my_pdf_file_here)
# Send email
email.send()
Run Code Online (Sandbox Code Playgroud)
我尝试使用子进程,但似乎我不能在生成PDF之前将上下文发送到我的模板来呈现它.
编辑(解决方案):感谢丹尼尔罗斯曼帮助实现我的目标.我在这里使用了wkhtmltopdf的测试文件:http://pydoc.net/Python/django-wkhtmltopdf/1.1/wkhtmltopdf.tests.tests/
这就是我在观点中所做的:
order = Order.objects.get(id=order_id)
return_file = "tmp/" + 'order' + str(order_id) + '.pdf'
context = {
'order' : order,
'items' : order.ordered_products.all()
}
response = PDFTemplateResponse(request=request,
context=context,
template="'products/order_pdf.html'",
cmd_options={ 'encoding': 'utf8',
'quiet': True
}
)
temp_file = response.render_to_temporary_file("products/order_pdf.html")
wkhtmltopdf(pages=[temp_file.name], output=return_file)
Run Code Online (Sandbox Code Playgroud)
然后,您可以在email.attach()方法中使用return_file,如下所示:
email.attach_file(return_file)
Run Code Online (Sandbox Code Playgroud)
您还可以在wkhtmltopdf方法中省略输出参数.然后该方法将返回输出并在attach_file()方法中使用此输出.
您的问题不在于 wkhtmltopdf,而是 django-wkhtmltopdf,它提供了一些使用 wkhtmltopdf 呈现的基于类的视图。如果您不需要视图,则不需要使用它们:您可以自己渲染模板并将结果字符串传递给命令行 wkhtmltopdf 工具。
看起来 django-wkhtmltopdf 库确实提供了一些实用函数(在 utils 目录中),这可能会使最后阶段变得更容易一些。