摘要

本文讲述通过python实现多线程将当前目录下的 .doc文档转.pdf、.docx文档转.pdf,以及.doc文档转.docx(在python中,如需对word文档进行读写,只能读写docx格式的word文档)。
其中涉及到的知识点有如下几点:

  1. 通过win32com模块对office文档进行格式转化
  2. 多线程的应用及控制

模块说明

  1. threading:线程应用模块
  2. pythoncom:处理word应用,使其独立运行的api接口模块
  3. win32com:office文档处理模块,通过 “pip install pypiwin32” 安装
import os, re
import threading
import pythoncom
from win32com.client import DispatchEx

定义main部分

代码分析

  1. 在多线程程序中,因电脑性能不同,需控制线程最大并发数。以下为控制线程最大并发数的代码,用到 threading.Semaphore() 方法
semaphore = threading.Semaphore(12)
  1. 定义线程锁。不同线程之间可能在输出面板同时输出,造成输出紊乱,如:
    线程1将输出:
    who am i in thread 1
    i am A
    线程2将输出:
    who am i in thread 2
    i am B
    线程同时运行时标准输出为:
    who am i in thread 1
    i am A
    who am i in thread 2
    i am B
    而线程同时运行时可能输出:
    who am i in thread 1
    who am i in thread 2
    i am B
    i am A
    以下为控制线程独立输出的代码,用到 threading.Lock() 方法
lock = threading.Lock()
  1. 遍历指定目录下所有文件,其中 file 为文件名,a 为该文件路径, c 为该文件同一文件夹下的所有文件集
for a, b, c in os.walk(pre):for file in c:
  1. 判断文件名后缀是否含有 .doc ,是则为 .doc 或者 .docx 文件,否则不处理
if re.search('\.doc', file) != None:
  1. threading.Thread(target=, args=) 定义线程,target 参数指定线程运行的方法,args 参数传入运行方法的参数,start() 方法执行线程,DocToDocx和DocToPdf的作用下文中会具体说明
threading.Thread(target=WordConvertToOther.DocToDocx, args=(pre + file,)).start()

main代码

if __name__ == '__main__':# 控制线程最大并发数为12semaphore = threading.Semaphore(12)# 线程锁lock = threading.Lock()# 当前脚本目录绝对路径pre = os.path.realpath('./') + '\\'for a, b, c in os.walk(pre):for file in c:if re.search('\.doc', file) != None:# 将doc转存为docxthreading.Thread(target=WordConvertToOther.DocToDocx, args=(pre + file,)).start()# 将doc、docx转存为pdf# threading.Thread(target=WordConvertToOther.DocToPdf, args=(pre + file, )).start()

定义doc转docx函数

代码分析

  1. 使函数在最大线程限制下运行
with semaphore:
  1. pythoncom.CoInitialize() 方法创建套间。pythoncom模块为线程和word对象创建一个套间,令其可以正常关联和执行。多线程运行office应用时需加入此模块方法,否则将出错,非多线程则不需要。之后的 pythoncom.CoUninitialize() 方法则用以释放套间资源
pythoncom.CoInitialize()
  1. 通过 DispatchEx(‘Word.Application’) 方法启动office应用程序,相当于在windows下打开office
word = DispatchEx('Word.Application')
  1. 通过 word.Documents.Open() 方法启动具体的某个文档文件
doc = word.Documents.Open(docpath)
  1. doc.SaveAs() 为将打开的doc存储为docx的主要方法。其中 re.sub 方法将路径中文件名的doc替换为docx,FileFormat 指定保存的文件格式,等于 12 保存为docx、等于 17 保存为pdf
doc.SaveAs(re.sub('.doc$', '.docx', docpath), FileFormat=12)
  1. 无论doc文档执行结果如何,都需让office应用程序关闭,否则将会在后台中继续运行,占用系统资源
word.Quit()

函数代码

    def DocToDocx(docpath):'''将doc转存为docx'''with semaphore:lock.acquire()try:# CoInitialize初始化,为线程和word对象创建一个套间,令其可以正常关联和执行pythoncom.CoInitialize()# 用DispatchEx()的方式启动MS Word或与当前已执行的MS Word建立连结word = DispatchEx('Word.Application')# 打开指定目录下doc文档doc = word.Documents.Open(docpath)# 将打开的doc文档存储为docxdoc.SaveAs(re.sub('.doc$', '.docx', docpath), FileFormat=12)# 关闭doc文档doc.Close()except:# 报错则输出报错文件print(docpath + ':无法打开')else:# 无报错输出转换完成print(os.path.basename(docpath) + " : 转换完成")finally:# 关闭office程序word.Quit()# 释放资源pythoncom.CoUninitialize()lock.release()

定义doc转pdf函数

函数代码

这里与doc转docx类似,直接附上函数代码:

    def DocToPdf(docpath):'''将doc、docx转存为pdf'''with semaphore:lock.acquire()try:pythoncom.CoInitialize()word = DispatchEx('Word.Application')doc = word.Documents.Open(docpath)doc.SaveAs(re.sub('\.doc.*', '.pdf', docpath), FileFormat=17)doc.Close()except:print(docpath + ':无法打开')else:print(os.path.basename(docpath) + " : 转换完成")finally:word.Quit()pythoncom.CoUninitialize()lock.release()

完整代码

import os, re
import threading
import pythoncom
from win32com.client import DispatchExclass WordConvertToOther:def DocToDocx(docpath):'''将doc转存为docx'''with semaphore:lock.acquire()try:# CoInitialize初始化,为线程和word对象创建一个套间,令其可以正常关联和执行pythoncom.CoInitialize()# 用DispatchEx()的方式启动MS Word或与当前已执行的MS Word建立连结word = DispatchEx('Word.Application')# 打开指定目录下doc文档doc = word.Documents.Open(docpath)# 将打开的doc文档存储为docxdoc.SaveAs(re.sub('.doc$', '.docx', docpath), FileFormat=12)# 关闭doc文档doc.Close()except:# 报错则输出报错文件print(docpath + ':无法打开')else:# 无报错输出转换完成print(os.path.basename(docpath) + " : 转换完成")finally:# 关闭office程序word.Quit()# 释放资源pythoncom.CoUninitialize()lock.release()def DocToPdf(docpath):'''将doc、docx转存为pdf'''with semaphore:lock.acquire()try:pythoncom.CoInitialize()word = DispatchEx('Word.Application')doc = word.Documents.Open(docpath)doc.SaveAs(re.sub('\.doc.*', '.pdf', docpath), FileFormat=17)doc.Close()except:print(docpath + ':无法打开')else:print(os.path.basename(docpath) + " : 转换完成")finally:word.Quit()pythoncom.CoUninitialize()lock.release()if __name__ == '__main__':# 控制线程最大并发数为12semaphore = threading.Semaphore(12)# 线程锁lock = threading.Lock()# 当前脚本目录绝对路径pre = os.path.realpath('./') + '\\'for a, b, c in os.walk(pre):for file in c:if re.search('\.doc', file) != None:# 将doc转存为docx# threading.Thread(target=WordConvertToOther.DocToDocx, args=(pre + file,)).start()# 将doc、docx转存为pdfthreading.Thread(target=WordConvertToOther.DocToPdf, args=(pre + file, )).start()

参考文献

  • https://www.jianshu.com/p/4fa504c720c1
  • http://yshblog.com/blog/57

【script】python实现多线程将doc、docx转pdf,doc转docx相关推荐

  1. 100天精通Python丨办公效率篇 —— 12、Python自动化操作 office-word(word转pdf、转docx、段落、表格、标题、页面、格式)

    本文收录于 <100天精通Python专栏 - 快速入门到黑科技>专栏,是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造. 基础知识篇以理论知识为主,旨在 ...

  2. python读取 xls,xlsx,csv,doc,docx,pdf 格式的文件

    前言 利用python读取 xls,xlsx,csv,doc,docx,pdf 格式的文件 python版本3.10.4 读取xls pip install xlrd==2.0.1 wps的.et文件 ...

  3. Python在Linux,Windows上打开有密doc,docx文件(密码已知)

    Python在Linux,Windows上打开有密doc,docx文件(密码已知) Linux Windows Linux Install: pip install msoffcrypto-tool ...

  4. Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvc

    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCo ...

  5. python docx 合并文档 图片_使用python抓取大量简历文档内数据(word:docx;pdf;图片等)输出表格文件...

    1. 文章背景描述: 近期公司有员工离职了,技术岗位的. 让HR招人,招聘进度也太慢了,实在等不及,就撸起袖子自己上.(之前从来没招聘过) 自己在某招聘网站注册后,花了若干人民币,短时间收到大量求职者 ...

  6. python中docx模块的使用_python使用docx模块读写docx文件的方法与docx模块常用方法详解...

    一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就是说python-docx模块会把word文档,文档中的段落.文本.字体等都看做对象,对对象 ...

  7. python读取docx文件_Python应用 | 读写docx文件 (值得收藏的技能)

    字处理软件是平时办公必备的同时也是最常用的软件之一,而字处理软件用的最多最频繁的就是微软的word,其扩展名为docx.在日常工作中,可能需要对很多的docx文件进行批处理,例如教师在批阅学生提交的电 ...

  8. python读取docx文件出错_Python读写docx文件的方法

    这篇文章主要介绍了关于Python读写docx文件的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 Python读写word文档有现成的库可以处理.我这里采用 python-doc ...

  9. 免费利用python把pdf格式转docx

    免费利用python把pdf格式转docx,再也不用wps等要钱办公软件转文档了,不多说,直接上代码 1.首先导入pdf包,通过pip安装 pip install pdfplumber 2.开发代码上 ...

最新文章

  1. java基于http协议编程_Java中基于HTTP协议网络编程
  2. mysql nosql引擎_nosql与mysql的区别是什么
  3. java 常用接口的实现--compareable
  4. (41)缺页异常简介
  5. Linux netstat -tunlp查看端口占用情况
  6. Java学习笔记:Javaweb的服务器介绍
  7. 阿里“计算”家族技术领头人分享会
  8. 微信小程序开发系列七:微信小程序的页面跳转
  9. python类定义学生信息_Python学生信息管理系统(注释最详细,小白都看的懂)
  10. Google SketchUp 7——简单而不简单
  11. idea 填充变量类型_填充IntelliJ IDEA项目
  12. cocos-2d iphone入门(二) cocos2d源代码生成查询文档
  13. 程序员代码面试指南读书笔记1
  14. 4针串口线接法图_串口通信RS232的基本接法,原来这么简单,今天终于弄明白了...
  15. 【Android 性能优化】应用启动优化 ( 主题背景图片设置 | 设置透明主题背景 | 设置应用启动主题背景、启动后恢复主题 )
  16. 非诚勿扰2最后李香山人生告别会上的孙红雷的台词
  17. linux有线网设置方法,有线网络使用教程
  18. 百度AI 开放平台 - 各大AI 开放平台开放能力解读和分析,技术的应用场景,技术前景
  19. PhoneGap VS. Titanium
  20. 程序员的选择,技术or管理

热门文章

  1. python+selenium h5QQ空间自动点赞器
  2. Pytorch入门(6)-图片风格迁移和GAN
  3. Python编写的桌面图形界面程序实现更新检测和下载安装
  4. Python getattr() 函数
  5. TCP中recv解阻塞的两种方式
  6. __name__ == ‘__main__‘的原理
  7. 机器学习的算法和普通《算法导论》里的算法有什么本质上的异同
  8. 微信公众平台中的openid是什么
  9. asp.net错误处理的三种方法
  10. [深度学习]生成对抗网络的实践例子