利用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函数的笔记整理
Apr 07 Python
使用SAE部署Python运行环境的教程
May 05 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
详解如何减少python内存的消耗
Aug 09 Python
如何基于Python实现自动扫雷
Jan 06 Python
Python垃圾回收机制三种实现方法
Apr 27 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
python实现人性化显示金额数字实例详解
Sep 25 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
php 缓存函数代码
2008/08/27 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
script的async属性以非阻塞的模式加载脚本
2013/01/15 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
详解python之配置日志的几种方式
2017/05/22 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
大学生职业生涯规划书参考模板
2014/03/05 职场文书
美术课外活动总结
2014/07/08 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
工资收入证明
2014/10/07 职场文书
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫