Django 使用WeasyPrint生成PDF带有公共页眉/页脚和分页
在本文中,我们将介绍如何使用Django和WeasyPrint生成带有公共页眉/页脚和分页的PDF文档。我们将学习如何使用WeasyPrint在Django项目中创建自定义PDF模板,并将其中的内容呈现为带有公共页眉和页脚的多页PDF文档。
阅读更多:Django 教程
什么是WeasyPrint?
WeasyPrint是一个用于将HTML/CSS呈现为PDF的Python库。它是一个开源项目,提供了一个强大而灵活的工具,使开发人员能够以Web技术创建定制的PDF文档。
集成WeasyPrint到Django项目
要将WeasyPrint集成到Django项目中,我们首先需要安装WeasyPrint库。可以使用以下命令来安装:
pip install WeasyPrint
接下来,在Django中创建一个视图函数,该函数将接收HTTP请求,使用WeasyPrint生成PDF,并返回PDF响应。下面是一个示例视图函数的代码:
from django.http import HttpResponse
from django.template.loader import get_template
from django.template import Context
import weasyprint
def generate_pdf(request):
# 获取要渲染为PDF的模板
template = get_template('pdf_template.html')
context = {'data': 'Hello, World!'}
html_template = template.render(context)
# 将HTML转换为PDF
pdf_file = weasyprint.HTML(string=html_template).write_pdf()
# 生成响应并返回PDF文件
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="output.pdf"'
response.write(pdf_file)
return response
在上面的代码中,我们首先获取要渲染为PDF的模板并传递所需的上下文变量。然后,我们使用WeasyPrint将HTML模板转换为PDF。最后,我们将生成的PDF作为响应返回给用户。
创建包含公共页眉和页脚的PDF模板
为了在生成的PDF文档中显示公共页眉和页脚,我们可以在PDF模板中定义这些元素。我们可以使用HTML和CSS来创建具有我们想要的样式和布局的页眉和页脚。
下面是一个示例PDF模板的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PDF Template</title>
<style>
@page {
margin-top: 1cm;
margin-bottom: 2cm;
margin-left: 2cm;
margin-right: 2cm;
@top-left {
content: "页眉内容";
}
@bottom-left {
content: "页脚内容";
}
}
</style>
</head>
<body>
<h1>PDF Template</h1>
<p>这是一个PDF模板示例。</p>
<p>该PDF由Django生成,并使用WeasyPrint库转换为PDF格式。</p>
<p>这里是一些数据: {{ data }}</p>
</body>
</html>
在上面的代码中,我们在模板的
标签中定义了一个CSS样式块。在这个样式块中,我们使用@page规则来设置页边距并定义了页眉和页脚的内容。添加分页
如果我们的PDF内容超过一页,我们希望在每一页的底部显示页码。为了实现这一点,我们可以在PDF模板中使用CSS伪元素和计数器来动态生成页码。
以下是修改后的PDF模板示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PDF Template</title>
<style>
@page {
margin-top: 1cm;
margin-bottom: 2cm;
margin-left: 2cm;
margin-right: 2cm;
@top-left {
content: "页眉内容";
}
@bottom-left {
content: "页脚内容";
}
@bottom-center {
content: counter(page);
}
}
body {
counter-reset: page;
}
h1 {
page: blank;
}
h1:after {
content: counter(page);
counter-increment: page;
}
</style>
</head>
<body>
<h1>PDF Template</h1>
<p>这是一个PDF模板示例。</p>
<p>该PDF由Django生成,并使用WeasyPrint库转换为PDF格式。</p>
<p>这里是一些数据: {{ data }}</p>
</body>
</html>
在上面的代码中,我们在模板的CSS样式块中定义了一个counter-reset规则来初始化页码计数器。然后,我们为每个
<
h1>元素定义了一个:after伪元素来生成动态的页码。
使用Django视图在浏览器中查看PDF
为了在浏览器中查看我们生成的PDF文档,我们可以创建另一个Django视图函数,并将其链接到URL上。
下面是一个示例视图函数的代码:
from django.shortcuts import render
def view_pdf(request):
return render(request, 'view_pdf.html')
在上面的代码中,我们简单地返回一个包含链接的HTML页面,用户点击该链接后将触发生成PDF的视图函数。
总结
在本文中,我们学习了如何使用Django和WeasyPrint生成带有公共页眉和页脚的PDF文档。我们了解了WeasyPrint库的基本概念,并详细介绍了如何在Django项目中集成WeasyPrint。
我们还学习了如何创建具有公共页眉和页脚的PDF模板,并在多页PDF文档中添加了分页功能。最后,我们学习了如何通过Django视图在浏览器中查看生成的PDF文档。
通过使用Django和WeasyPrint,我们可以轻松地生成自定义样式和布局的PDF文档,为我们的网站或应用程序添加强大的报表和打印功能。