django pdf export

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,descriptionpid在生成的PDF.

ghi*_*man 9

正如其他人所提到的,最好的方法是生成一个模板,然后使用众多库中的一个将结果转换为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.

  • 是'wctmltopdf`的`render_to_pdf`的一部分,因为我无法找到并导入它?!? (2认同)

Lak*_*sad 2

只需按照您想要的方式生成 HTML 并要求xhtml2pdf将其转换为 pdf 即可。

就像评论之一提到的那样,有ReportLab,但这需要您以 PDF 所需的格式给出规范。它为您提供了更多控制权,但如果您更容易生成 HTML(您需要生成的标准方式),您可以使用 pisa 将其制作为 pdf。