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.html和pdf_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文档。
极客教程