在 Python 中生成 PDF
我最喜欢的库是 pdf-reports
使用 Python 生成 PDF 报告
Python 拥有丰富的库和模块,为生成专业的 PDF 报告提供了强大的工具。
本指南探讨了使用 Python 创建 PDF 文档 的各种方法,涵盖了一些流行的库,如 ReportLab、FPDF、Xhtml2pdf、WeasyPrint、Jinja2、pdf-reports 和 PdfKit。
为什么使用 Python 生成 PDF 报告?
- 自动化:Python 脚本可以自动化报告生成,节省时间并减少人为错误。
- 定制化:通过添加文本、图片、表格和图表,可以根据特定需求定制报告。
- 一致性:使用标准化模板确保报告的品牌一致性。
- 多功能性:可以生成发票、商业报告、数据摘要或任何其他类型的文档。
用于 PDF 生成的流行 Python 库
ReportLab
ReportLab 是一个功能强大的库,允许您以 编程方式 创建 PDF 文档。它支持添加文本、图片、表格和图形,适用于各种类型的报告。
优点:
- 功能丰富
- 高级 API 易于使用
- 支持注释和交互式表单等高级功能
缺点:
- 相比其他库,学习曲线较陡
- 对于某些任务,API 不够直观
使用 ReportLab
安装:使用 pip 安装 ReportLab:
pip install reportlab
基本设置:
from reportlab.pdfgen import canvas
c = canvas.Canvas('hello.pdf')
# 添加文本:
python c.drawString(100, 800, "Hello World")
# 保存 PDF:
python c.save()
FPDF
FPDF 是一个用纯 Python 编写的简单但功能强大的 PDF 创建库。它非常适合使用少量代码生成基本的 PDF 文档。
优点:
- 易于学习和使用
- 轻量且快速
- 支持 Unicode 字符
缺点:
- 相比 ReportLab,功能集有限
- 对页面上元素的布局控制较少
使用 FPDF
安装:使用 pip 安装 FPDF:
pip install fpdf2
基本设置:
from fpdf import FPDF pdf = FPDF()
# 添加文本:
python pdf.add_page()
pdf.set_font('Arial', 'B', 16)
pdf.cell(40, 10, 'Hello World')
# 保存 PDF:
python pdf.output('hello.pdf', 'F')
Xhtml2pdf
Xhtml2pdf 是一个 CSS/HTML 到 PDF 的转换器,它在内部使用 ReportLab。它非常适合从 HTML 模板生成 PDF,是网络到 PDF 转换的绝佳选择。
优点:
- 将 HTML 和 CSS 转换为 PDF
- 支持复杂的布局和样式
- 与 Django 等 Web 框架集成良好
缺点:
- 需要了解 HTML 和 CSS
- 可能不适合简单的非基于网络的报告
使用 Xhtml2pdf
安装:使用 pip 安装 Xhtml2pdf:
pip install xhtml2pdf
从 HTML 生成 PDF:python
from xhtml2pdf import pisa
html = "<h1>Hello World</h1>"
with open('hello.pdf', 'wb') as output_file:
pisa_status = pisa.CreatePDF(html, dest=output_file)
WeasyPrint
WeasyPrint 是一个功能强大的 Python 库,允许开发人员使用高质量的渲染将 HTML 和 CSS 转换为 PDF 文档。它特别适用于生成需要精确格式的报告、发票或其他文档。以下是一些示例,演示了如何在各种场景中使用 WeasyPrint。
功能
- 将 HTML 和 CSS 转换为 PDF 文档。
- 通过 Jinja2 等模板引擎处理动态数据渲染。
安装:
pip install weasyprint
以下是一个从 HTML 字符串生成 PDF 的简单示例:
from weasyprint import HTML
html_string = """
<html>
<head><title>Sample PDF</title></head>
<body>
<h1>Hello, WeasyPrint!</h1>
<p>This is a sample PDF generated using WeasyPrint.</p>
</body>
</html>
"""
HTML(string=html_string).write_pdf("sample.pdf")
在这个示例中,使用 WeasyPrint 的 HTML 类将 HTML 字符串转换为名为 “sample.pdf” 的 PDF 文件。
从文件加载 HTML
您还可以直接从文件加载 HTML 内容:
from weasyprint import HTML
# 从文件加载 HTML
HTML('sample.html').write_pdf('output.pdf')
此方法在 HTML 内容存储在外部文件时非常有用。 使用 CSS 样式表
WeasyPrint 支持使用 CSS 样式表来样式化 PDF 文档。以下是应用 CSS 文件的方法:
from weasyprint import HTML
# 从文件加载 HTML 和 CSS
HTML('sample.html').write_pdf('output.pdf', stylesheets=['sample.css'])
这允许更复杂的样式化,使创建视觉上吸引人的 PDF 变得更容易。
Jinja2
Jinja2 是一个功能强大的 Python 模板引擎,允许您通过在模板中嵌入 Python 表达式、条件语句和循环来生成动态内容。本指南将引导您通过使用 Jinja2 的各种示例,从基本的变量替换到更高级的功能,如模板继承。
Jinja2 的关键功能
- 可与 WeasyPrint 或 ReportLab 结合使用,用于动态生成 HTML 内容的模板引擎。
- 适合将数据嵌入到预定义的模板中。
- 安装:
pip install jinja2
参见官方 Jinja2 文档页面上的示例:https://jinja.palletsprojects.com/en/3.0.x/
pdfkit
pdfkit 是一个功能强大的 Python 库,简化了将 HTML 内容转换为 PDF 文档的过程。它作为 wkhtmltopdf 工具的包装器,利用 WebKit 准确地将 HTML 页面渲染为 PDF 格式。本指南将引导您通过使用 pdfkit 生成 PDF 的各种示例和使用场景。
关键功能
- 作为 wkhtmltopdf 的 Python 包装器,将 HTML 转换为 PDF。
- 需要全局安装 wkhtmltopdf。https://wkhtmltopdf.org/downloads.html
安装:
# 并确保安装了 wkhtmltopdf。
基本用法 - 将 HTML 字符串转换为 PDF
您可以使用 pdfkit.from_string() 将简单的 HTML 字符串转换为 PDF 文件:
import pdfkit
html_sample = """
<html>
<head><title>Sample PDF</title></head>
<body>
<h1>This is a heading</h1>
<p>First line.</p>
<p>Second line.</p>
<p>Third line.</p>
<p>Fourth line.</p>
</body>
</html>
"""
pdfkit.from_string(html_sample, 'output.pdf')
这将在当前目录中生成一个名为 output.pdf 的 PDF 文件。
将本地 HTML 文件转换为 PDF
如果您有一个本地存储的 HTML 文件,请使用 pdfkit.from_file():
import pdfkit
pdfkit.from_file('local.html', 'sample.pdf')
PDF 报告库 (pdf-reports)
使用 Python 的 pdf-reports 库创建 PDF 报告可以是一种生成外观专业的文档的强大方式,这些文档可以从 HTML 或 Pug 模板生成。该库利用 Semantic UI 框架的现代组件,并提供将表格、图表和其他元素嵌入到 PDF 中的例程。
pdf-reports 库旨在从 HTML 或 Pug 模板创建视觉上吸引人的 PDF 报告。它官方支持 Python 3.x,但也可以在 Python 2.x 上运行,前提是安装了适当版本的 weasyprint。这使其成为生成动态且结构良好的文档的强大工具。
关键功能
- 现代组件:使用 Semantic UI 框架创建现代外观的组件。
- 嵌入元素:允许将表格、图表和其他元素嵌入到 PDF 中。
- 模板支持:支持 HTML 和 Pug 模板,实现灵活的报告设计。
pdf-reports 的示例用法
安装:
pip install pdf-reports
以下是使用 pdf-reports 库的基本示例:
from pdf_reports import PDFReport
# 定义您的模板文件 (template.pug)
template = """
doctype html
html
head
title= title
body
h1= title
p This is a sample report.
"""
# 创建 PDF 报告实例
report = PDFReport(template)
# 为模板设置上下文
context = {
'title': 'Sample Report'
}
# 生成 PDF
pdf = report.generate(context, output='sample_report.pdf')
Python 中 PDF 生成的起飞
Python 提供了一系列强大的库,用于生成 PDF 报告。无论您是创建发票、商业报告还是数据摘要,这些工具都可以帮助您自动化流程、自定义文档并确保品牌一致性。选择最适合您需求的库,今天就开始创建专业的 PDF!