有没有返回HttpResponse或使用URL,用wkhtmltopdf创建PDF文件的方法?我只是想将PDF文件附加到电子邮件中

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()方法中使用此输出.

Dan*_*man 5

您的问题不在于 wkhtmltopdf,而是 django-wkhtmltopdf,它提供了一些使用 wkhtmltopdf 呈现的基于类的视图。如果您不需要视图,则不需要使用它们:您可以自己渲染模板并将结果字符串传递给命令行 wkhtmltopdf 工具。

看起来 django-wkhtmltopdf 库确实提供了一些实用函数(在 utils 目录中),这可能会使最后阶段变得更容易一些。