Python生成Word与PDF文档:unoconv、python-docx及pdfkit方案对比
本文对比了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,且部分用法较为复杂。
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或工作能带来一定的帮助。如果有疑问,欢迎留言交流。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









