Django 使用 WeasyPrint 生成带有共同头/尾和分页的PDF

Django 使用 WeasyPrint 生成带有共同头/尾和分页的PDF

在本文中,我们将介绍如何使用Django和WeasyPrint来生成带有共同头/尾和分页的PDF。WeasyPrint是一个功能强大的Python库,可以将HTML转换为PDF,并且具有丰富的布局和样式选项。

阅读更多:Django 教程

什么是WeasyPrint?

WeasyPrint是一个开源的Python库,用于将HTML和CSS转换为PDF文件。它是基于WebKit引擎的一个封装,具有灵活的布局和样式选项,可以生成高质量的PDF文档。

安装和设置

要开始使用WeasyPrint生成PDF,首先需要安装WeasyPrint库。通过运行以下命令来安装:

pip install WeasyPrint

安装完成后,我们需要在Django的设置文件中配置WeasyPrint。打开settings.py文件,并将以下内容添加到文件底部:

WEASYPRINT_FONT_CONFIG = {
    'font_path': '/path/to/your/fonts/',
    'font_url': '/path/to/your/fonts/',
}

确保将/path/to/your/fonts/替换为您的字体文件夹的实际路径。

创建基本的PDF视图

现在,我们可以创建一个基本的视图来生成PDF。首先,在Django应用程序的views.py文件中导入WeasyPrint:

from django.http import HttpResponse
from django.template.loader import get_template
from weasyprint import HTML

接下来,创建一个视图函数来处理生成PDF请求:

def generate_pdf(request):
    # 使用Django的模板引擎加载HTML模板文件
    template = get_template('pdf_template.html')
    context = {'data': 'This is some data for the PDF.'}
    html = template.render(context)

    # 将HTML转换为PDF
    pdf = HTML(string=html).write_pdf()

    # 将生成的PDF作为HttpResponse返回
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename="generated_pdf.pdf"'
    response.write(pdf)

    return response

在示例中,我们首先使用Django的模板引擎加载一个名为pdf_template.html的HTML模板文件,并将上下文数据添加到模板中。然后,我们使用WeasyPrint将HTML转换为PDF,并将生成的PDF作为HttpResponse返回。

请注意,pdf_template.html是一个包含要在PDF中呈现的内容的模板文件。您可以根据自己的需求进行定制。

添加共同的头/尾和分页

要在生成的PDF中添加共同的头/尾和分页,我们可以通过WeasyPrint的一些特性来实现。首先,我们需要创建共同的头和尾的HTML模板文件。

在您的Django应用程序的templates文件夹中创建一个名为pdf_header.html的文件,将以下内容添加到文件中:

<div class="page-header">
    <h1>这是PDF的头部</h1>
</div>

同样,在templates文件夹中创建一个名为pdf_footer.html的文件,并将以下内容添加到文件中:

<div class="page-footer">
    <p>这是PDF的底部</p>
</div>

接下来,我们需要更新生成PDF的视图函数,以便在加载HTML模板文件时,将共同的头和尾添加到它们:

def generate_pdf(request):
    template = get_template('pdf_template.html')
    header = get_template('pdf_header.html')
    footer = get_template('pdf_footer.html')
    context = {'data': 'This is some data for the PDF.'}
    html = f"{header.render()}{template.render(context)}{footer.render()}"
    pdf = HTML(string=html).write_pdf()
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename="generated_pdf.pdf"'
    response.write(pdf)
    return response

在更新后的视图函数中,我们首先使用Django的模板引擎加载pdf_header.htmlpdf_footer.html模板文件,并将它们的内容作为字符串添加到HTML模板中。

现在,生成的PDF中将包含共同的头和尾。

此外,WeasyPrint还提供了其他功能,如在页面底部添加页码。要在PDF中添加页码,我们可以将以下代码添加到视图函数中:

from weasyprint import CSS

def generate_pdf(request):
    template = get_template('pdf_template.html')
    header = get_template('pdf_header.html')
    footer = get_template('pdf_footer.html')
    context = {'data': 'This is some data for the PDF.'}
    html = f"{header.render()}{template.render(context)}{footer.render()}"

    # 将CSS样式添加到HTML
    css = CSS(string='''
        @page { 
            size: A4;
            margin: 1cm 1cm 1.5cm;
            @top-center { content: element(header); }
            @bottom-right { content: element(footer); }
        }
        .page-number:before {
            content: counter(page);
        }
    ''')

    # 将HTML和CSS一起转换为PDF
    pdf = HTML(string=html).write_pdf(stylesheets=[css])

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename="generated_pdf.pdf"'
    response.write(pdf)

    return response

在更新后的视图函数中,我们首先添加了一个新的import语句来导入WeasyPrint的CSS模块。然后,我们创建了一个包含自定义CSS样式的CSS对象。

在CSS样式中,我们使用@page规则来定义PDF页面的大小、边距以及头部和底部的内容位置。在我们的示例中,我们将头部放置在页面的上部中央,底部放置在页面的右下角。我们在CSS样式中还添加了一个.page-number:before选择器,用于在底部显示页码。

接下来,我们在HTML转换为PDF时,将CSS样式表传递给WeasyPrint的write_pdf()方法。

现在,生成的PDF中将包含共同的头和尾,并在底部显示页码。

总结

本文介绍了如何使用Django和WeasyPrint来生成带有共同头/尾和分页的PDF。通过使用WeasyPrint的强大功能,我们可以轻松地将HTML转换为高质量的PDF,并且可以通过自定义CSS样式来添加共同的头/尾和分页效果。

要注意的是,在实际应用中,您可能需要根据自己的需求进行更多的定制和优化。但是,本文提供的示例和方法应该可以帮助您入门并开始生成自定义的PDF文档。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程