利用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开发vim插件及心得分享
Nov 04 Python
在Django的session中使用User对象的方法
Jul 23 Python
快速了解Python中的装饰器
Jan 11 Python
Python subprocess模块详细解读
Jan 29 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
django框架auth模块用法实例详解
Dec 10 Python
python实现扫雷游戏
Mar 03 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
使用pandas模块实现数据的标准化操作
May 14 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
PHPMailer邮件发送的实现代码
2013/05/04 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
js实现录音上传功能
2019/11/22 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
python中的yield使用方法
2014/02/11 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
详解Django配置优化方法
2019/11/18 Python
sklearn+python:线性回归案例
2020/02/24 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
2014年自我评价
2014/01/04 职场文书
给实习单位的感谢信
2014/02/01 职场文书
中文教师求职信
2014/02/22 职场文书
专业技术职务聘任书
2014/03/29 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
教师党员承诺书2015
2015/01/21 职场文书
服务员岗位职责
2015/02/03 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
《植树问题》教学反思
2016/03/03 职场文书
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js