Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数

文件夹中获取需要转换的文件数,将其全部转换或可单独转换单个文件,并获取转成PDF的文件页数,具体实现如下:
用到的库:os,sys,pdfplumber,client22,pythoncom
库的安装方法:pip install pythoncom
代码:

# import pdfplumber
import os
import sys
import pdfplumber
from client22 import dynamic
import pythoncom
def __WrapDispatch(dispatch, userName = None, resultCLSID = None, typeinfo = None, \UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER,WrapperClass = None):"""Helper函数返回CLSID的makepy生成类(如果存在的话),否则使用CDispatch进行处理。"""assert UnicodeToString is None, "this is deprecated and will go away"if resultCLSID is None:try:typeinfo = dispatch.GetTypeInfo()if typeinfo is not None: # 有些对象返回空值,有些引发异常。。。resultCLSID = str(typeinfo.GetTypeAttr()[0])except (pythoncom.com_error, AttributeError):passif WrapperClass is None: WrapperClass = CDispatchreturn dynamic.Dispatch(dispatch, userName, WrapperClass, typeinfo, clsctx=clsctx)def Dispatch(dispatch, userName = None, resultCLSID = None, typeinfo = None, UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER):"""创建基于调度的COM对象。"""assert UnicodeToString is None, "这是不赞成的,将消失"dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)return __WrapDispatch(dispatch, userName, resultCLSID, typeinfo, clsctx=clsctx)class CDispatch(dynamic.CDispatch):"""作为最后手段使用的动态类。重写dynamic.CDispatch的目的是使策略永久化使用makepy生成的包装器Python类而不是dynamic.CDispatch如果可能的话。"""def _wrap_dispatch_(self, ob, userName = None, returnCLSID = None, UnicodeToString=None):assert UnicodeToString is None, "this is deprecated and will go away"return Dispatch(ob, userName, returnCLSID,None)class Constants:"""生成的COM常量的容器。"""def __init__(self):self.__dicts__ = [] # A list of dictionariesdef __getattr__(self, a):for d in self.__dicts__:if a in d:return d[a]raise AttributeError(a)# And create an instance.
constants = Constants()class PDFConverter:                #在类中,将word,excel,ppt文件路径、pdf文件路径和word,excel,ppt后台进程实例作为类的属性。def __init__(self, pathname, export='.'):  self._handle_postfix = ['doc','docx','xls','xlsx','pptx','ppt']  #处理文件后缀的listself._filename_list = list()    #list()是将元组转换成list,元组的元素值不能修改self._export_folder = os.path.join(os.path.abspath('.'), 'pdfconver')  #将转换成pdf的文件放到这个路径中,.os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。 if not os.path.exists(self._export_folder):  #如果文件夹存在,返回True;如果path不存在,返回False。 os.mkdir(self._export_folder)    #创建目录的路径,自动创建C:\xxx\xxx\pdfconver的文件夹self._enumerate_filename(pathname)       #调用函数def _enumerate_filename(self, pathname):'''读取所有文件名'''full_pathname = os.path.abspath(pathname)  #返回path规范化的绝对路径if os.path.isfile(full_pathname):  #如果full_pathname是一个存在的文件,返回True。否则返回False。 if self._is_legal_postfix(full_pathname):   #如果是合法的后缀self._filename_list.append(full_pathname)    #将文件添加到文件名list中else:raise TypeError('文件 {} 后缀名不合法!仅支持如下文件类型:{}。'.format(pathname, '、'.join(self._handle_postfix)))elif os.path.isdir(full_pathname):  #如果full_pathname是一个存在的目录,则返回True。否则返回False。 for relpath, _, files in os.walk(full_pathname):  #遍历文件、目录for name in files:   filename = os.path.join(full_pathname, relpath, name)  #将目录、文件、名字组合成一个路径if self._is_legal_postfix(filename):   #判断文件名的后缀是否合法self._filename_list.append(os.path.join(filename))else:raise TypeError('文件/文件夹 {} 不存在或不合法!'.format(pathname))def _is_legal_postfix(self, filename):return filename.split('.')[-1].lower() in self._handle_postfix and not os.path.basename(filename).startswith('~')def run_conver(self):'''进行批量处理,根据后缀名调用函数执行转换'''print('需要转换的文件数:', len(self._filename_list))  for filename in self._filename_list:   postfix = filename.split('.')[-1].lower()   #split()分隔符对字符串进行切片,分割次数,默认为 -1, 即分隔所有,lower() 将所有大写都转换成小写funcCall = getattr(self, postfix)   #返回对象的属性值print('原文件:', filename)funcCall(filename)print('转换完成!')def doc(self, filename):'''doc 和 docx 文件转换'''try: name = os.path.basename(filename).split('.')[0] + '.pdf'  # 返回filename最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素。 exportfile = os.path.join(self._export_folder, name)   #将多个路径组合在一起print('保存 PDF 文件:', exportfile)w = Dispatch("Word.Application")    #首先使用dispatch函数创建一个word程序的后台进程,默认是不显示,只在后台处理。doc = w.Documents.Open(filename)    #Documents.Open函数打开word文件,返回一个文件对象doc.ExportAsFixedFormat(exportfile, 17)       except Exception as e:print("转换异常,异常1为:{}".format(e))finally:        #关闭打开的word后台进程。w.Quit()def docx(self, filename):self.doc(filename)def xls(self, filename):'''xls 和 xlsx 文件转换'''try:   name = os.path.basename(filename).split('.')[0] + '.pdf'exportfile = os.path.join(self._export_folder, name)# xlApp = DispatchEx("Excel.Application")  #创建一个新的Excel进程xlApp = Dispatch("Excel.Application")  #,初始化,试图寻找并复用一个已有的Excel进程(比如你已经在运行着的Excel程序)xlApp.Visible = True          #excel可编辑的窗口不可见    xlApp.DisplayAlerts = False   #属性关闭,Excel就不会弹出确认窗,而是直接覆盖同名文件。   books = xlApp.Workbooks.Open(filename,False)books.ExportAsFixedFormat(0, exportfile)      #调用文件对象的ExportAsFixedFormat函数将文件内容输出books.Close(False)print('保存 PDF 文件:', exportfile)f = pdfplumber.open(exportfile)   #打开pdf文件page = len(f.pages)                    #pdf的页数print("文件",filename,"的页数为:",page)except Exception as e:print("转换异常,异常2为:{}".format(e))finally:        #关闭打开excel的后台进程。           xlApp.Quit()def xlsx(self, filename):self.xls(filename)def ppt(self, filename):'''ppt 和 pptx 文件转换'''try:name = os.path.basename(filename).split('.')[0] + '.pdf'exportfile = os.path.join(self._export_folder, name)p = Dispatch("PowerPoint.Application")   #创建一个ppt程序的后台进程,默认是不显示,只在后台处理。ppt = p.Presentations.Open(filename, False, False, False)ppt.ExportAsFixedFormat(exportfile, 2, PrintRange=None)   #导出固定格式print('保存 PDF 文件:', exportfile)f = pdfplumber.open(exportfile)   #打开pdf文件page = len(f.pages)                    #pdf的页数print("文件",filename,"的页数为:",page)except Exception as e:print("转换异常,异常3为:{}".format(e))finally:        #关闭打开的ppt后台进程。           p.Quit()def pptx(self, filename):self.ppt(filename)if __name__ == "__main__":# 文件夹批量导入转换# folder = 'Desktop\py\office' # pathname = os.path.join(os.path.abspath('.'), folder)# 单个文件的转换pathname = "C:/Users/Weibo/Desktop/12.pptx"pdfConverter = PDFConverter(pathname)pdfConverter.run_conver()

实现效果:

参考文献:https://blog.csdn.net/XnCSD/article/details/85208303?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数相关推荐

  1. 计算机二级是wpsoffice高级应用吗,考计算机二级ms office高级应用但是自己电脑上office软件都是wps 这和word ppt excel 软件有区别吗...

    计算机二级office用的是微软的office2010版本.不是wps. 1.现在全国或者是全省计算机一级.二级.三级,考试的系统都是win7.office的话,都是用微软的office2010版本的 ...

  2. c++byte数组和文件的相互转换_终于!word、excel、ppt文件相互转换技巧来了!

    不知道大家在用Office软件的时候,有没有遇到过这样的问题.做了个Word文档总结,却需要转换成PPT上台汇报:做了个Word表格统计,却需要转换成Excel进行分析:做了个Excel图表分析,却需 ...

  3. excel中html批量转化为pdf文件,批量将Excel转换成pdf文档的方法

    在我们办公过程中建立各种表格都喜欢用excel软件,特别是那些人事部的同事,将数据存储好之后,因为担心他人修改我们的数据,所以会选择将excel文件转换成比较难以编辑的pdf文件.可是,excel如何 ...

  4. word excel转换成html格式的文件,将PPTWORDEXCEL转换成html格式

    public static void PptToHtmlFile(string PptFilePath) { Microsoft.Office.Interop.PowerPoint.Applicati ...

  5. word文档转换成swf格式文件在网页中用flash显示

    word文档转换成swf格式文件在网页中用flash显示 在OA系统中我们常常需要将上传的word文档在网页中阅览,一般上传后的文档用html的形式查看是会导致排版混乱的,这次我介绍在ASP.NET中 ...

  6. xml文件转换成图片_如何把pdf文件转换成图片?

    pdf文件怎么转成JPG图片呢?相信有不少人在迷惑,可能还在想着截图等操作来完成转换,但如果是截图成JPG图片后的效果可能很差,并没有之前pdf文件那么清楚.那这样往往打印出来的效果也不怎么理想,那怎 ...

  7. 在电脑上怎么打印文件_电脑上怎么mov格式怎么转换成mp4

    展开全部 在我们日常娱乐和日常工作中,有时候需要转换32313133353236313431303231363533e58685e5aeb931333433653938视频格式,比如说把MOV转换成M ...

  8. 把Excel转换成xml文件

    /*** 读取Excel并转换* @param file 获取到的文件* @return Map<String,List<String>> 把表头和表体以键值对的形式保存*/p ...

  9. excel中html批量转化为pdf文件,如何将大量的Excel转换成PDF?

    大家都知道Excel表,最怕别人修改了,尤其是数据.一旦修改,可能就会有麻烦.那如何是好呢?有一个最简单的办法就是把Excel转换成PDF文件,这样别人只能阅读不能编辑,就不用担心被修改了,哈哈~下面 ...

最新文章

  1. python在汽车上的应用_python实现图片识别汽车功能
  2. 【感想文】感情经历,是否给你我带来的些许提升?我想,有。
  3. svn cvs git的区别
  4. 日期格式无法识别_Excel – 将各种伪日期批量转化为真日期
  5. ASP.NET Core 3.0 发布
  6. 华为nova7se乐活版支持鸿蒙,华为nova7se乐活版和畅享20se哪个好 参数区别对比评测...
  7. python把工作簿拆分为工作表_excel将一个工作表根据条件拆分成多个工作表
  8. dax圣经 翻新_使用翻新和Node JS的Android图像上传
  9. 如何使用postman测试服务器的性能,如何用Postman测试API
  10. 华为hs8145v5如何改桥接_Linksys VelopAX5300和AC3900套装 Mesh组网实战 - 桥接
  11. redis bigkey 删除问题
  12. buffer正确的拼接方式
  13. 奇怪:WINDOWS排序错了?
  14. qfile.remove 删除已经被加载的文件_Milvus数据管理:删除的实现原理
  15. 液晶电视测试软件u盘,突破封锁!用U盘给电视安装APP居然这么简单
  16. php 做批量打印二维码,php语言开发的网站,如何实现批量打印快递单的功能?
  17. LCS算法和背包算法
  18. CKEditor5系列三:创建一个功能相对完善的插件
  19. 全局修改样式(全局颜色更改)
  20. JDBC由浅入深解析(C3P0)(DBUtils)

热门文章

  1. (RPA)——检测 ie 进程是否存在,存在则杀掉 ie 进程
  2. [prometheus]Step7-prometheus使用阿里云企业邮箱告警
  3. Python爬虫可以爬取什么呢?
  4. 雷达通信 技术《相控阵入门到精通》 视频教程 代码 下载
  5. open cv均值 中值 高斯 双边高斯 滤波及模糊
  6. c语言bit作用,c语言中bit的用法
  7. yuv 10bit 8bit
  8. Bitbucket备份恢复
  9. Micro:bit - 功能引脚介绍
  10. mac下免费的动态截屏制图工具:kap