我在Django 1.6中使用wkhtmltopdf Package 器将模板生成为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
上面的代码生成的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()
我尝试使用子进程,但它似乎不像我可以发送上下文到我的模板来呈现它之前生成的PDF。
6条答案
按热度按时间carvr3hs1#
问题不在于wkhtmltopdf,而在于django-wkhtmltopdf提供了一些基于类的视图,如果你不需要这些视图,你就不需要使用它们:您可以自己呈现模板并将结果字符串传递给命令行wkhtmltopdf工具。
看起来django-wkhtmltopdf库确实提供了一些实用函数(在utils目录中),这可能会使最后一步变得更容易。
6mw9ycah2#
我的工作
这里的问题是,当发送带有pdf文件附件的邮件时,email.attach需要类似字节的对象,但是我们有pdftemplate响应对象。
我试着用几种方法把它转换成字节,但是都出错了。所以,我只是随机地进入了PDFTemplateResponse类的定义,然后我在里面找到了rendered_content方法,多亏了vs代码让它变得更容易。
然后我刚刚做的是写下面的一行,它的工作!
第一个月
这是我第一次发表关于堆栈溢出的文章。所以,请原谅我的错误。
mw3dktmi3#
感谢Daniel Roseman for the help to go towards what I wanted,我确实在这里使用了wkhtmltopdf的测试文件:http://pydoc.net/Python/django-wkhtmltopdf/1.1/wkhtmltopdf.tests.tests/
这是我在我的观点中所做的:
然后可以像这样在
email.attach()
方法中使用return_file:也可以在wkhtmltopdf方法中省略output参数,然后该方法将返回输出,并在
attach_file()
方法中使用该输出。此答案以edit的形式发布到以下问题:有没有方法在不返回HttpResponse或使用URL的情况下使用wkhtmltopdf创建PDF文件?我只想通过CC BY-SA 3.0下的OP dguay将PDF文件附加到电子邮件中。
h79rfbju4#
answer provided已经过时了,因为
render_to_temporary_file
不再是PDFTemplateResponse
的方法。我还没有尝试通过电子邮件发送PDF,但是要将生成的PDF保存到Django模型的文件域,您可以按照以下步骤操作:
它应该很容易从那里电子邮件的PDF。
rpppsulh5#
嘿,请检查您的wkhtmltopdf二进制文件是可执行的或没有。因为这个PDFTemplateResponse为我工作。
ljo96ir56#
这个代码片段放在views.py中后可能会对您有所帮助。