Python自动化快速实现将HTML转换为PDF格式
作者:E-iceblue
HTML(超文本标记语言)是一种用于创建网页的标准标记语言,主要用于定义内容的结构与布局,但当你需要将其作为本地文档展示或存档时,PDF 才是更加适合的选择。无论是生成电子发票、技术文档,还是导出美观的报表,PDF 都能跨平台地保留原始排版与视觉样式。在今天的文章中,我们就来看看如何在 Python 中将 HTML 快速转换为 PDF,实现高效与精准的文档处理。
准备工作
在开始编写代码之前,我们需要安装支持文档处理的 Python 库。本文将使用 Spire.Doc for Python,它能够解析 HTML 的 CSS 样式并将其精准地渲染到 PDF 页面中。你可以通过 pip 快速安装:
pip install Spire.Doc
也可以到 E-ICEBLUE 官网下载 Spire.Doc 安装包,然后进行自定义手动安装。此外,该产品还提供免费版,专门用于小型项目或购买商业版前的测试。
在 Python 中将 HTML 文件转换为 PDF
如果我们已经拥有现成的 HTML 静态文件,通过直接加载的方式进行转换是最为高效的选择。这种方法非常适合处理大量的网页存档、离线技术手册或自动生成的测试报告。在具体实现上,我们通过调用库中封装好的文件处理接口,能够确保 HTML 的层级结构被完整映射到文档模型中,从而实现格式的精准转换。
代码实现步骤:
- 创建一个
Document类的对象。 - 调用
LoadFromFile方法,加载 HTML 文件。 - 调用
SaveToFile方法,将 HTML 保存为 PDF 格式的文件。
下方为代码实例,使用时注意将文件路径替换为真实路径:
from spire.doc import Document, FileFormat, XHTMLValidationType
# 创建 Document 类的对象
doc = Document()
# 载入本地 HTML 文件
doc.LoadFromFile("input/示例文档.html", FileFormat.Html, XHTMLValidationType.none)
# 将内容直接保存为 PDF 格式
doc.SaveToFile("output/HTML文件转PDF.pdf", FileFormat.PDF)
doc.Close()
HTML 文件与转换后的 PDF 文件对比示意图:

在 Python 中将 HTML 字符串转换为 PDF
对于动态生成的内容,例如从数据库调取数据并渲染到 HTML 模板的情况,直接处理字符串流比操作文件更加灵活。这种方式提高程序的响应速度和处理逻辑的连贯性。
在代码中,我们主要使用将字符串写入文档段落的方法来将其转换为标准的 PDF 文件。这样不仅能保持复杂的 CSS 样式,还能方便地与其它动态生成的文档元素进行拼接。
代码实现步骤:
- 创建文档对象后,依次添加
Section和Paragraph。 - 使用
AppendHTML方法,将 HTML 字符串动态写入段落。 - 通过
SaveToFile方法将整个文档结构渲染为 PDF 文件。
from spire.doc import Document, FileFormat
# 创建文档对象并添加结构
doc = Document()
sec = doc.AddSection()
par = sec.AddParagraph()
# 定义包含 CSS 样式的 HTML 字符串
html_string = """
<html>
<head>
<style>
h1 { color: #2c3e50; font-family: Arial; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1>旅游统计报表</h1>
<table>
<tr><th>国家</th><th>收入(亿美元)</th></tr>
<tr><td>法国</td><td>79.5</td></tr>
<tr><td>美国</td><td>76.9</td></tr>
</table>
</body>
</html>
"""
# 将 HTML 字符串渲染进段落
par.AppendHTML(html_string)
# 保存文档
doc.SaveToFile("E:/Administrator/Python1/output/HTML字符串转PDF.pdf", FileFormat.PDF)
doc.Close()
保存后的 PDF 文件预览:

进阶配置:转换时设置页边距与页面大小
直接将 HTML 文件或字符串转换为 PDF 虽然简便快捷,但在实际的应用中,默认的页面设置不一定能够匹配多种需求。因此,我们可以在转换前通过 PageSetup 类对 PDF 的页边距、纸张大小(如 A4、Letter)进行微调。
设置页边距
# 设置页边距(单位通常为磅) sec.PageSetup.Margins.Top = 50.0 sec.PageSetup.Margins.Bottom = 50.0 sec.PageSetup.Margins.Left = 40.0 sec.PageSetup.Margins.Right = 40.0
合理的页边距设置不仅能让文档看起来更专业,还能有效避免内容被裁切。
设置页面大小为 A4
# 设置页面大小为 A4 纸张 # 还可以选择 Letter, Legal, A3 等其他标准预设 sec.PageSetup.PageSize = PageSize.A4() # 也可以手动指定页面的宽度和高度(单位:磅) # sec.PageSetup.PageSize = SizeF(600.0, 800.0)
设置页面大小有助于使内容能够适配打印输出或屏幕阅读。
知识拓展
下面是小编为大家整理的Python借用免费开源库实现HTML 转 PDF的方法,希望对大家有所帮助
1.WeasyPrint (推荐)
适合需要生成高质量报告、发票等专业文档的场景,特别在处理表格、字体嵌入和多栏排版时表现出色。
from weasyprint import HTML, CSS
from weasyprint.text.fonts import FontConfiguration
# 准备HTML内容
html_content = """
<html>
<head><meta charset="UTF-8"><title>报告</title></head>
<body><h1>销售报表</h1><p>2026年Q1数据...</p></body>
</html>
"""
# 字体配置(推荐)
font_config = FontConfiguration()
HTML(string=html_content).write_pdf(
'report.pdf',
stylesheets=[CSS(string='@page { size: A4; margin: 2cm; }')],
font_config=font_config
)注意:WeasyPrint 默认不支持外部网络字体,可通过 font_config 参数指定自定义字体文件路径。
2.Playwright
如果你需要完整保留网页的JS交互效果和精确布局,Playwright是最佳选择。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
page.pdf(path='example.pdf', format='A4')
browser.close()3.pdfkit
适合快速将静态HTML内容转换为PDF,或对wkhtmltopdf有使用经验的开发者。
import pdfkit
# 从URL生成
pdfkit.from_url('https://example.com', 'example.pdf')
# 从文件生成
pdfkit.from_file('input.html', 'output.pdf')注意:使用前需先安装 wkhtmltopdf 命令行工具。
4.xhtml2pdf
适合处理简单HTML结构且对代码体积有要求的项目。
from xhtml2pdf import pisa
with open('test.pdf', 'w+b') as result_file:
pisa.CreatePDF('<p>简单内容</p>', dest=result_file)注意:xhtml2pdf 对 CSS 3 的支持有限,布局可能失真。
避坑指南:排查和解决常见问题
1.网络资源加载失败(WeasyPrint/pdfkit):HTML 中引用的 CSS、JS、图片如果使用相对路径,可能无法加载。建议替换为绝对路径,或使用 --enable-local-file-access 选项。
2.中文字体显示为方块(所有本地工具):系统未安装中文字体。可指定系统中已安装的字体(如 SimHei、Microsoft YaHei),或通过代码嵌入 .ttf 字体文件并指定 @font-face。
3.页面分页错乱(WeasyPrint/pdfkit):通过 CSS 的 page-break-before/after/inside 属性精确控制分页;@page 可定义页边距和页眉页脚。
4.安装依赖错误(pdfkit):pdfkit 只是 Python 的封装,必须在系统中单独安装 wkhtmltopdf 并配置环境变量。如果提示未找到,可在代码中指定可执行文件路径:
config = pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_url('url', 'out.pdf', configuration=config)5.CSS Flex/Grid 样式丢失:WeasyPrint 对 Flexbox/Grid 支持较好,而 pdfkit/wkhtmltopdf 基于过时的 Qt WebKit,无法渲染现代 CSS。这种情况建议改用 WeasyPrint。
6.性能问题:批量转换大量 HTML 时,可复用 Playwright 的浏览器实例,或对 WeasyPrint 使用多线程并发处理,避免每次转换都重新启动浏览器。
总结
通过以上两种方法,我们可以轻松应对各种 HTML 转 PDF 的场景。无论是处理现有的文件库,还是动态渲染即时生成的网页数据,Spire.Doc for Python 都能提供简单高效的解决方案。
以上就是Python自动化快速实现将HTML转换为PDF格式的详细内容,更多关于Python HTML转PDF的资料请关注脚本之家其它相关文章!
