利用python程序生成word和PDF文档的方法


Posted in Python onFebruary 14, 2017

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

将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob、Apache POI、Java2Word、iText等各种方式,以及使用freemarker这样的模板引擎这样的方式。php中也有一些相应的方法,但在python中将web/html内容生成world文档的方法是很少的。其中最不好解决的就是如何将使用js代码异步获取填充的数据,图片导出到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等js代码生成的图片,是无法将这些图片转换到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这样的js代码生成的图标无法转换为pdf(因为它的功能主要是将html转换为pdf,而不是将js转换为pdf)。对于纯静态页面的转换效果还是不错的。

      2.其他

其他生成pdf的插件还有:weasyprint,reportlab,PyPDF2等,经简单试验都不如pdfkit效果好,且有些用法复杂。

总结

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

Python 相关文章推荐
动态创建类实例代码
Oct 07 Python
Django的分页器实例(paginator)
Dec 01 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
Python编程flask使用页面模版的方法
Dec 28 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
Python插件机制实现详解
May 04 Python
为什么称python为胶水语言
Jun 16 Python
python名片管理系统开发
Jun 18 Python
Python中类型检查的详细介绍
Feb 13 #Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 #Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 #Python
python数据清洗系列之字符串处理详解
Feb 12 #Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 #Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 #Python
python3制作捧腹网段子页爬虫
Feb 12 #Python
You might like
Home Coffee Roasting
2021/03/03 咖啡文化
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php array_slice函数的使用以及参数详解
2008/08/30 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
javascript event 事件解析
2011/01/31 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
Javascript实现网络监测的方法
2015/07/31 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
微信小程序左右滑动的实现代码
2017/12/15 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
tensorflow构建BP神经网络的方法
2018/03/12 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
Django中的AutoField字段使用
2020/05/18 Python
二年级语文教学反思
2014/02/02 职场文书
《小池塘》教学反思
2014/02/28 职场文书
小学班主任寄语大全
2014/04/04 职场文书
比赛口号大全
2014/06/10 职场文书
年底个人总结范文
2015/03/10 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
Nginx配置https的实现
2021/11/27 Servers
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技