Python生成Word与PDF文档:unoconv、python-docx及pdfkit方案对比

陈默
陈默
发布时间:2026-10-13| 2人浏览过
原创

本文对比了Python中生成Word和PDF的几种主流方案。针对Word导出,分析了unoconv对静态HTML的支持及其对异步数据和JS图表的局限,以及python-docx在格式控制上的不足。针对PDF导出,重点介绍了基于WebKit内核的pdfkit,指出其高保真度优势及对JS生成图表支持的缺失,并简要提及weasyprint等替代方案。

一、程序导出Word文档的方法

在Java生态中,将Web或HTML内容导出为Word文档已有诸多成熟方案,例如Jacob、Apache POI、Java2Word、iText等工具,以及利用FreeMarker模板引擎的方式。相比之下,PHP也具备相关实现,但在Python领域,直接将Web或HTML内容生成Word文档的方法相对较少。其中,最具挑战性的问题在于如何处理通过JavaScript异步获取并填充的数据,以及如何将图片正确导出到Word文档中。

1. unoconv

功能:

1. 支持将本地HTML文档转换为docx格式的文档。因此,操作流程通常要求先将网页中的HTML文件保存至本地,随后调用unoconv进行转换。该方法的转换效果尚可,且使用方式十分简便。

\# 安装
sudo apt-get install unoconv
\# 使用
unoconv -f pdf *.odt
unoconv -f doc *.odt
unoconv -f html *.odt

缺点:

1. 仅支持对静态HTML进行转换。若页面中存在通过Ajax异步获取数据的场景,则无法完成转换(前提是确保从Web页面保存下来的HTML文件中已包含所需数据)。

2. 仅支持对HTML进行转换。如果页面中包含使用Echarts、Highcharts等JavaScript代码生成的图片,这些图片无法被转换到Word文档中。

3. 生成的Word文档内容格式难以精确控制。

2. python-docx

功能:

1. python-docx是一个用于读写Word文档的Python库。

使用方法:

1. 获取网页中的数据,使用Python手动排版后添加到Word文档中。

from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('Document Title', 0)
p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True
document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')
document.add_paragraph(
 'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
 'first item in ordered list', style='ListNumber'
)
document.add_picture('monty-truth.png', width=Inches(1.25))
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for item in recordset:
 row_cells = table.add_row().cells
 row_cells[0].text = str(item.qty)
 row_cells[1].text = str(item.id)
 row_cells[2].text = item.desc
document.add_page_break()
document.save('demo.docx')
from docx import Document
from docx.shared import Inches
document = Document()
for row in range(9):
 t = document.add_table(rows=1,cols=1,style = 'Table Grid')
 t.autofit = False #很重要!
 w = float(row) / 2.0
 t.columns[0].width = Inches(w)
document.save('table-step.docx')

缺点:

功能相对有限。存在诸多限制,例如不支持模板功能,只能生成格式较为简单的Word文档。

二、程序导出PDF文档方法

1. pdfkit

功能:

1. wkhtmltopdf主要用于将HTML生成PDF。

2. pdfkit是基于wkhtmltopdf封装的Python库,支持将URL、本地文件或文本内容转换为PDF,其底层最终调用的是wkhtmltopdf命令。这是目前接触到的Python生成PDF效果较好的方案之一。

优点:

1. wkhtmltopdf利用WebKit内核将HTML转换为PDF。

WebKit是一个高效且开源的浏览器内核,Chrome和Safari等主流浏览器均采用了该内核。Chrome浏览器在打印当前网页时,提供的“保存为PDF”选项正是基于此原理。

2. wkhtmltopdf使用WebKit内核的PDF渲染引擎将HTML页面转换为PDF。其转换质量高保真,且使用过程非常简单。 使用方法:

\# 安装
pip install pdfkit
\# 使用
import pdfkit
pdfkit.from_url('http://google.com', 'out.pdf')
pdfkit.from_file('test.html', 'out.pdf')
pdfkit.from_string('Hello!', 'out.pdf')

缺点:

1. 对于使用Echarts、Highcharts等JavaScript代码生成的图表,无法转换为PDF(因为其核心功能是将HTML转换为PDF,而非执行JS代码)。对于纯静态页面的转换效果依然不错。

2. 其他方案

其他生成PDF的插件还包括weasyprint、reportlab、PyPDF2等。经过简单试验,这些方案的效果均不如pdfkit,且部分用法较为复杂。

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或工作能带来一定的帮助。如果有疑问,欢迎留言交流。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。