Python自动化快速实现将HTML转换为PDF格式

 更新时间:2026年04月10日 08:35:45   作者:E-iceblue  
HTML(超文本标记语言)是一种用于创建网页的标准标记语言,主要用于定义内容的结构与布局,在今天的文章中,我们就来看看如何在 Python 中将 HTML 快速转换为 PDF,实现高效与精准的文档处理,希望对大家有所帮助

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 的层级结构被完整映射到文档模型中,从而实现格式的精准转换。

代码实现步骤:

  1. 创建一个 Document 类的对象。
  2. 调用 LoadFromFile 方法,加载 HTML 文件。
  3. 调用 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 样式,还能方便地与其它动态生成的文档元素进行拼接。

代码实现步骤:

  1. 创建文档对象后,依次添加 SectionParagraph
  2. 使用 AppendHTML 方法,将 HTML 字符串动态写入段落。
  3. 通过 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.中文字体显示为方块(所有本地工具):系统未安装中文字体。可指定系统中已安装的字体(如 SimHeiMicrosoft 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的资料请关注脚本之家其它相关文章!

相关文章

  • Python中xmltodict库的使用方法详解

    Python中xmltodict库的使用方法详解

    在Python编程中,处理XML数据是一项常见且重要的任务,XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,Python的标准库并不直接提供处理XML的便捷方法,因此我们需要借助第三方库来实现这一功能,本文将详细介绍xmltodict库的使用,需要的朋友可以参考下
    2024-11-11
  • opencv3/python 鼠标响应操作详解

    opencv3/python 鼠标响应操作详解

    今天小编就为大家分享一篇opencv3/python 鼠标响应操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python密码学各种加密模块教程

    python密码学各种加密模块教程

    这篇文章主要为大家介绍了python密码学各种加密模块教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 使用Python计算隐含波动率

    使用Python计算隐含波动率

    隐含波动率(Implied Volatility)在金融领域是一个核心概念,用于描述市场对于未来资产价格波动的预期程度,本文将详细介绍如何使用Python计算隐含波动率,需要的可以了解下
    2024-11-11
  • 快速一键生成Python爬虫请求头

    快速一键生成Python爬虫请求头

    这篇文章主要介绍了如何快速一键生成Python爬虫请求头,帮助大家更好的理解和学习使用python爬虫,感兴趣的朋友可以了解下
    2021-03-03
  • Windows系统下Python如何进行版本升级与管理

    Windows系统下Python如何进行版本升级与管理

    用户经常在使用python时候,发现版本升级过快,不同的项目可能用到不同的python版本,本文就windows下,关于Python 3.11 升级到 Python 3.12做一个简单的记录和介绍,希望对大家有所帮助
    2025-05-05
  • OpenCV清除小面积连通域的实现方法

    OpenCV清除小面积连通域的实现方法

    本文主要介绍了OpenCV清除小面积连通域的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 如何不用安装python就能在.NET里调用Python库

    如何不用安装python就能在.NET里调用Python库

    这篇文章主要介绍了如何不用安装python就能在.NET里调用Python库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 利用python-pypcap抓取带VLAN标签的数据包方法

    利用python-pypcap抓取带VLAN标签的数据包方法

    今天小编就为大家分享一篇利用python-pypcap抓取带VLAN标签的数据包方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python实现将JSON转换为CSV格式

    Python实现将JSON转换为CSV格式

    JSON(JavaScript  Object Notation)和 CSV(Comma-Separated Values)是数据交换和存储中最常用的两种格式,本文将详细介绍如何使用Free Spire.XLS for Python将JSON数据转换为 CSV 文件,感兴趣的小伙伴可以了解下
    2026-03-03

最新评论