利用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 相关文章推荐
python中的代码编码格式转换问题
Jun 10 Python
说一说Python logging
Apr 15 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
用Python实现数据的透视表的方法
Nov 16 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python处理session的方法整理
Aug 29 Python
python性能测试工具locust的使用
Dec 28 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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
处理单名多值表单的详解
2013/06/08 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
[01:08:32]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第二场 1月18日
2021/03/11 DOTA
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
Keras实现DenseNet结构操作
2020/07/06 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
PHP面试题集
2016/12/18 面试题
如何打开WebSphere远程debug
2014/10/10 面试题
高中毕业的自我鉴定
2013/12/09 职场文书
大学生的四年学习自我评价
2013/12/13 职场文书
出国留学担保书
2014/05/20 职场文书
淘宝店策划方案
2014/06/07 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
朋友聚会开场白
2015/06/01 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
MySql子查询IN的执行和优化的实现
2021/08/02 MySQL
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL