我想生成一个PDF,它将以表格格式显示我的查询集的输出,例如:
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()我需要在生成的PDF中显示name,description和pid的值。
发布于 2011-10-22 03:20:03
正如其他人所提到的,最好的方法是生成一个模板,然后使用周围的许多库中的一个将结果转换为PDF。此方法为您提供了对模板的通常数量的控制,例如使用标记。
我已经使用了前面提到的ReportLab/Pisa设置,但发现它非常有限,大多数布局都必须使用表构建,并且CSS2规范的许多部分还没有实现。
一个更容易使用的库是wkhtmltopdf,它是WebKit的无头发行版。这样做的好处是可以像任何WebKit浏览器一样呈现您的模板,从而允许您使用webkit特定的附加组件,例如webkit中存在的CSS3规范的一部分。
使用包装库django-wkhtmltopdf,您可以在视图中使用render_to_pdf,而不是通常的Django render_to_response。
免责声明:我是这个库的贡献者。
更新
这个库已经转换为CBV,为了方便起见,下面的大多数信息(我将留下来帮助添加一些上下文)现在都在库本身中实现。
有关如何实现以下代码块的示例,请参阅quickstart文档。如果您需要使用更高级的用法,您可以继承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)这里的条件语句允许您将?as=html传递给视图,以便可以在浏览器中进行开发。这是一个有点丑陋的方式,但有计划在不久的版本中解决这个问题。
使用这个视图,您可以像往常一样在视图中循环显示objects的内容,甚至可以扩展基本模板。为了样式的可维护性和可读性,我通常会专门为PDF使用不同的样式表,因为您需要为PDF做一些不同的事情,例如,如果您想将页脚块保持在相同的位置,则设置一个最小高度。
在此注释中,您可以创建页眉和页脚模板,通过将它们作为kwargs的一部分传递到render_to_pdf,这些模板将在您的PDF的每一页上使用。
发布于 2011-10-19 21:02:02
只需生成您想要的超文本标记语言,并要求xhtml2pdf将其转换为pdf。
就像其中一个评论提到的那样,有ReportLab,但这需要你以PDF所要求的格式给出规范。它为你提供了更多的控制,但是如果它对你来说更容易生成HTML,你无论如何都需要生成的标准方式,你可以使用pisa来使它成为pdf。
发布于 2014-12-11 17:53:20
尝试使用python-pdfkit的wkhtmltopdf
这似乎是最好的solution.Supports javascript和css
https://stackoverflow.com/questions/7821087
复制相似问题