Python将word文档批量转PDF
前面有一篇<Python批量创建word文档(2)- 加图片和表格>的文章,利用这篇文章创建的word文档来批量转PDF文档。代码:
1 '''
2 #python批量将word文档转换成PDF文件
3 '''
4 #导入所需库
5 from docx import Document
6 from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
7 from docx.shared import Pt
8 from docx.shared import Inches
9 from docx.oxml.ns import qn
10 from win32com.client import Dispatch, constants, gencache
11 import os
12 import time
13
14 #定义今日黄金价格
15 price = input("请输入今日黄金价格: ")
16 #定义今日日期
17 today = time.strftime("%Y{y}%m{m}%d{d}",time.localtime()).format(y='年',m='月',d='日')
18 #定义客户列表
19 company_list = ['张三','李四','王五','赵六','许七']
20
21
22 #开始循环列表,每循环一次创建一个word文档
23 for customer in company_list:
24 #开始创建word文档
25 document = Document()
26 #定义文档初始格式
27 document.styles['Normal'].font.name = '微软雅黑'
28 document.styles['Normal'].font.size = Pt(12)
29 #设置文档中文字体默认格式
30 document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'),u'微软雅黑')
31
32 #增加图片
33 document.add_picture('D:/Python代码素材/word自动化办公/banner.jpg', width=Inches(6))
34
35 #向文档中增加第一自然段
36 p1 = document.add_paragraph()
37 #设置第一自然段格式
38 p1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
39 #向第一自然段添加内容
40 run1 = p1.add_run('关于下达%s的价格通知' % today )
41 #设置内容格式
42 run1.font.name = '黑体'
43 run1.font.size = Pt(25)
44 run1.font.bold = True
45 #设置中文字体格式
46 run1._element.rPr.rFonts.set(qn('w:eastAsia'),u'黑体')
47
48 #设置第一自然段的段前段后距离
49 p1.space_after = Pt(5)
50 p1.space_before = Pt(5)
51
52 #增加第二自然段
53 p2 = document.add_paragraph()
54 #设置第二自然段格式
55 p2.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
56 #增加内容
57 run2 = p2.add_run('尊敬的: ' + customer + ', 您好!')
58 #设置内容格式
59 run2.font.name = '微软雅黑'
60 run2.font.size = Pt(18)
61 run2.font.bold = True
62 #设置中文字体格式
63 run2._element.rPr.rFonts.set(qn('w:eastAsia'),u'微软雅黑')
64
65 #增加第三自然段
66 p3 = document.add_paragraph()
67 #设置第三自然段对齐方式
68 p3.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
69 #增加内容
70 run3 = p3.add_run(' 为提供优质客户服务,我公司现将%s的黄金价格通知如下!' % today)
71 #设置格式
72 run3.font.name = '仿宋_GB2312'
73 run3.font.size = Pt(16)
74 run3.font.bold = True
75 #设置中文格式
76 run3._element.rPr.rFonts.set(qn('w:eastAsia'),u'仿宋_GB2312')
77
78 #增加表格
79 table = document.add_table(rows=3,cols=3,style="Table Grid")
80 #合并第一列的单元格
81 table.cell(0, 0).merge(table.cell(0, 2))
82 #设置合并后的单元格的格式
83 table.cell(0, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
84 #向合并后的单元格内写入内容
85 table_run = table.cell(0, 0).paragraphs[0].add_run('关于下达%s的价格通知' % today)
86 #设置字体
87 table_run.font.name = '隶书'
88 table_run.font.size = Pt(15)
89 table_run.font.bold = True
90 #设置中文字体格式
91 table_run._element.rPr.rFonts.set(qn('w:eastAsia'),u'隶书')
92
93 #开始向其他单元格写入内容,设置每个单元格的文字内容居中
94 table.cell(1, 0).text = '日期'
95 table.cell(1, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
96 table.cell(1, 1).text = '价格'
97 table.cell(1, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
98 table.cell(1, 2).text = '备注'
99 table.cell(1, 2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
100
101 table.cell(2, 0).text = today
102 table.cell(2, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
103 table.cell(2, 1).text = price
104 table.cell(2, 1).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
105 table.cell(2, 2).text = '这里是备注'
106 table.cell(2, 2).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
107
108 #增加第四自然段
109 p4 = document.add_paragraph()
110 #设置第四自然段靠右对齐
111 p4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
112 #第四自然段增加内容
113 run4 = p4.add_run('(联系人:小刘 电话:18888888888)')
114 #设置字体格式
115 run4.font.name = '幼圆'
116 run4.font.size = Pt(16)
117 run4.font.bold = True
118 #设置中文字体格式
119 run4._element.rPr.rFonts.set(qn('w:eastAsia'),u'幼圆')
120
121 #增加分页符
122 document.add_page_break()
123 #在分页后增加第五自然段
124 p5 = document.add_paragraph()
125 #设置第五自然段对齐方式
126 p5.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
127 #增加第五自然段内容
128 run5 = p5.add_run()
129 run5.font.name = '方正舒体'
130 run5.font.size = Pt(30)
131 run5.font.bold = True
132 run5._element.rPr.rFonts.set(qn('w:eastAsia'),u'方正舒体')
133
134 #判定要存储的文件是否存在,如果存在就删除
135 if os.path.exists('%s-%s-价格通知.docx' % (customer, today)):
136 os.remove('%s-%s-价格通知.docx' % (customer, today))
137 #休眠五秒以待代码完成
138 time.sleep(1)
139
140 #保存文档
141 document.save('%s-%s-价格通知.docx' % (customer, today))
142
143 #利用保存后的word文档转换PDF
144 #先找word文档位置
145 docx_path = '%s-%s-价格通知.docx' % (customer, today)
146 #要保存pdf文件的位置
147 pdf_path = '%s-%s-价格通知.pdf' % (customer, today)
148 #调用gencache指向office功能
149 gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 4)
150 #调用word控件
151 wd = Dispatch('Word.Application')
152 #以只读方式打开word文档
153 doc = wd.Documents.Open(docx_path, ReadOnly=1)
154 #导出生成的pdf文档
155 doc.ExportAsFixedFormat(pdf_path, constants.wdExportFormatPDF, Item=wdExportDocumentWithMarkup,
156 CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
157 wd.Quit(constants.wdDoNotSaveChanges)
158 time.sleep(5)
159 if os.path.exists('%s-%s-价格通知.docx' % (customer, today)):
160 os.remove('%s-%s-价格通知.docx' % (customer, today))
161
完工。
Python将word文档批量转PDF的更多相关文章
- Python将word文档转换成PDF文件
如题. 代码: ''' #將word文档转换为pdf文件 #用到的库是pywin32 #思路上是调用了windows和office功能 ''' #导入所需库 from win32com.client ...
- Python之word文档替换字符串(也可以用于短模板套用)
Python之word文档替换字符串(也可以用于短模板套用),代码如下: 1 ''' 2 #word模板套用1:创建模板,适合比较短的文档 3 ''' 4 5 #导入所需库 6 from docx i ...
- 利用Python操作Word文档【图片】
利用Python操作Word文档
- 用java将简单的word文档换成pdf文档
用java将简单的word文档换成pdf文档的方式很多,因为很多都没有实际测试过,所以这里就先泛泛的说一下 整体上来看分两种: 1.纯java代码实现,有很多优秀的开源软件可以用,比如poi,itex ...
- Python之word文档模板套用 - 真正的模板格式套用
Python之word文档模板套用: 1 ''' 2 #word模板套用2:套用模板 3 ''' 4 5 #导入所需库 6 from docx import Document 7 ''' 8 #另存w ...
- Python读取word文档内容
1,利用python读取纯文字的word文档,读取段落和段落里的文字. 先读取段落,代码如下: 1 ''' 2 #利用python读取word文档,先读取段落 3 ''' 4 #导入所需库 5 fro ...
- python 使用win32com实现对word文档批量替换页眉页脚
最近由于工作需要,需要将70个word文件的页眉页脚全部进行修改,在想到这个无聊/重复/没有任何技术含量的工作时,我的内心是相当奔溃的.就在我接近奔溃的时候我突然想到完全可以用python脚本来实现这 ...
- Java利用aspose-words将word文档转换成pdf(破解 无水印)
首先下载aspose-words-15.8.0-jdk16.jar包 http://pan.baidu.com/s/1nvbJwnv 引入jar包,编写Java代码 package doc; impo ...
- 2018-10-04 [日常]用Python读取word文档中的表格并比较
最近想对某些word文档(docx)的表格内容作比较, 于是找了一下相关工具. 参考Automate the Boring Stuff with Python中的word部分, 试用了python-d ...
随机推荐
- 根节点到叶子节点路径之和为target
//递归吧,但是在递归到底的条件上要判断好,比如说完整路径是到叶子节点,也就是说左右子节点都为空,并且这时候的root.val==target表示找到了一个list,再返回. 但是因为我并没有直接就用 ...
- 接上一篇:(二) IOC的概念和作用
IOC的概念和作用 控制反转(IoC:Inversion of Control)把创建对象的权利转交给框架(框架的重要特征),并非面向对象的专用术语. 它包含依赖注入(DI:Dependency In ...
- Python JSON存储数据
前言: 很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据.不管专注的是什么,程序都把用户提供的信息存储在列表和字典等数据结构中.用户关闭 程序时,你几乎总是要保存他们提供的信 ...
- Session 与 sql 会话,mysql 权限设置,mybatis 逆向工程
Session 与 Sql 会话注意点: 通过 sqlSessionFactoty 工厂建立的与sql的会话,在进行相应的插入操作后,需要进行 commit 操作才会让数据库执行插入更新操作.如何主键 ...
- 浅谈 倍增/ST表
命题描述 给定一个长度为 \(n\) 的序列,\(m\) 次询问区间最大值 分析 上面的问题肯定可以暴力对吧. 但暴力肯定不是最优对吧,所以我们直接就不考虑了... 于是引入:倍增 首先,倍增是个什么 ...
- CoProcessFunction实战三部曲之一:基本功能
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Android面试题《思考与解答》11月刊
又来更新啦,Android面试题<思考与解答>11月刊奉上. 说说View/ViewGroup的绘制流程 View的绘制流程是从ViewRoot的performTraversals开始的, ...
- python之迭代器,生成器小结
1.凡是可作用于for循环的对象都是Iterable类型: 2.凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列: 3.集合数据类型如list.dict.str等 ...
- CAS学习过程中的一些记录
1 inline jint Atomic::cmpxchg (jint exchange_value, volatile jint* dest, jint compare_value) { 2 int ...
- 第15.39节、splitDockWidget和tabifyDockWidget嵌套布局QDockWidget的PyQt人机对话案例:笨笨机器人
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在第<第三十一章.containers容器类部件QDo ...