ha2*_*109 5 pdf django pdf-generation django-views
我想生成一个PDF,它将以表格格式显示我的queryset的输出,例如:
query = ModelA.objects.filter(p_id=100)
class ModelA(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
p_id = models.IntegerField()
description = models.TextField()
Run Code Online (Sandbox Code Playgroud)
我需要显示的值name,description并pid在生成的PDF.
正如其他人所提到的,最好的方法是生成一个模板,然后使用众多库中的一个将结果转换为PDF.此方法为您提供了对模板的常规控制,例如使用标记.
我已经使用了之前提到的ReportLab/Pisa设置,但发现它非常有限,大多数布局必须使用表格构建,CSS2规范的许多部分尚未实现.
一个更容易使用的库是wkhtmltopdf,它是WebKit的无头分发.这样可以像任何webkit浏览器一样呈现您的模板,从而让您使用webkit特定的附加功能,例如WebKit中存在的CSS3规范的一部分.
使用包装器库django-wkhtmltopdf,您可以render_to_pdf在您的视图中而不是通常的Django render_to_response.
免责声明:我是这个图书馆的撰稿人.
此库已转换为CBV,下面的大部分信息(我将留下以帮助添加一些上下文)现在已在库本身中实现以方便使用.
有关如何实现以下代码块的示例,请参阅快速入门文档.如果您需要使用更高级的用法,您可以子类化PDFTemplateView并添加各种选项,如文件名和边距.
示例视图:
from django.shortcuts import render_to_response
from wkhtmltopdf import render_to_pdf
def pdf(request):
context.update({'objects': ModelA.objects.filter(p_id=100)})
kwargs = {}
if request.GET and request.GET.get('as', '') == 'html':
render_to = render_to_response
else:
render_to = render_to_pdf
kwargs.update(dict(
filename='model-a.pdf',
margin_top=0,
margin_right=0,
margin_bottom=0,
margin_left=0))
return render_to('pdf.html', context, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这里的条件语句允许您将?as = html传递给视图,以便您可以在浏览器中进行开发.目前这是一种丑陋的方式,但有计划很快在发布中解决这个问题.
使用此视图,您可以像平常一样循环视图中的内容,objects甚至可以扩展基本模板.我通常使用专门针对PDF的不同样式表来提供样式的可维护性和可读性,因为您需要为PDF做一些不同的事情,例如如果要将页脚块保持在同一位置,请设置最小高度.
在本文中,您可以创建将在PDF的每个页面上使用的页眉和页脚模板,方法是将它们作为一部分传递给render_to_pdf kwargs.
| 归档时间: |
|
| 查看次数: |
4876 次 |
| 最近记录: |