利用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让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
使用Python的Flask框架来搭建第一个Web应用程序
Jun 04 Python
python中函数传参详解
Jul 03 Python
Python+Wordpress制作小说站
Apr 14 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
使用python爬取微博数据打造一颗“心”
Jun 28 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
Python 简单计算要求形状面积的实例
Jan 18 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
如何用python批量调整视频声音
Dec 22 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 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
PHP5 安装方法
2006/10/09 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
python随机取list中的元素方法
2018/04/08 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
《陶罐和铁罐》教学反思
2014/02/19 职场文书
校庆活动方案
2014/03/31 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
2015年护士节慰问信
2015/03/23 职场文书
拉贝日记观后感
2015/06/05 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
Python实现归一化算法详情
2022/03/18 Python
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript