Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数
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文件页数相关推荐
- 计算机二级是wpsoffice高级应用吗,考计算机二级ms office高级应用但是自己电脑上office软件都是wps 这和word ppt excel 软件有区别吗...
计算机二级office用的是微软的office2010版本.不是wps. 1.现在全国或者是全省计算机一级.二级.三级,考试的系统都是win7.office的话,都是用微软的office2010版本的 ...
- c++byte数组和文件的相互转换_终于!word、excel、ppt文件相互转换技巧来了!
不知道大家在用Office软件的时候,有没有遇到过这样的问题.做了个Word文档总结,却需要转换成PPT上台汇报:做了个Word表格统计,却需要转换成Excel进行分析:做了个Excel图表分析,却需 ...
- excel中html批量转化为pdf文件,批量将Excel转换成pdf文档的方法
在我们办公过程中建立各种表格都喜欢用excel软件,特别是那些人事部的同事,将数据存储好之后,因为担心他人修改我们的数据,所以会选择将excel文件转换成比较难以编辑的pdf文件.可是,excel如何 ...
- word excel转换成html格式的文件,将PPTWORDEXCEL转换成html格式
public static void PptToHtmlFile(string PptFilePath) { Microsoft.Office.Interop.PowerPoint.Applicati ...
- word文档转换成swf格式文件在网页中用flash显示
word文档转换成swf格式文件在网页中用flash显示 在OA系统中我们常常需要将上传的word文档在网页中阅览,一般上传后的文档用html的形式查看是会导致排版混乱的,这次我介绍在ASP.NET中 ...
- xml文件转换成图片_如何把pdf文件转换成图片?
pdf文件怎么转成JPG图片呢?相信有不少人在迷惑,可能还在想着截图等操作来完成转换,但如果是截图成JPG图片后的效果可能很差,并没有之前pdf文件那么清楚.那这样往往打印出来的效果也不怎么理想,那怎 ...
- 在电脑上怎么打印文件_电脑上怎么mov格式怎么转换成mp4
展开全部 在我们日常娱乐和日常工作中,有时候需要转换32313133353236313431303231363533e58685e5aeb931333433653938视频格式,比如说把MOV转换成M ...
- 把Excel转换成xml文件
/*** 读取Excel并转换* @param file 获取到的文件* @return Map<String,List<String>> 把表头和表体以键值对的形式保存*/p ...
- excel中html批量转化为pdf文件,如何将大量的Excel转换成PDF?
大家都知道Excel表,最怕别人修改了,尤其是数据.一旦修改,可能就会有麻烦.那如何是好呢?有一个最简单的办法就是把Excel转换成PDF文件,这样别人只能阅读不能编辑,就不用担心被修改了,哈哈~下面 ...
最新文章
- python在汽车上的应用_python实现图片识别汽车功能
- 【感想文】感情经历,是否给你我带来的些许提升?我想,有。
- svn cvs git的区别
- 日期格式无法识别_Excel – 将各种伪日期批量转化为真日期
- ASP.NET Core 3.0 发布
- 华为nova7se乐活版支持鸿蒙,华为nova7se乐活版和畅享20se哪个好 参数区别对比评测...
- python把工作簿拆分为工作表_excel将一个工作表根据条件拆分成多个工作表
- dax圣经 翻新_使用翻新和Node JS的Android图像上传
- 如何使用postman测试服务器的性能,如何用Postman测试API
- 华为hs8145v5如何改桥接_Linksys VelopAX5300和AC3900套装 Mesh组网实战 - 桥接
- redis bigkey 删除问题
- buffer正确的拼接方式
- 奇怪:WINDOWS排序错了?
- qfile.remove 删除已经被加载的文件_Milvus数据管理:删除的实现原理
- 液晶电视测试软件u盘,突破封锁!用U盘给电视安装APP居然这么简单
- php 做批量打印二维码,php语言开发的网站,如何实现批量打印快递单的功能?
- LCS算法和背包算法
- CKEditor5系列三:创建一个功能相对完善的插件
- 全局修改样式(全局颜色更改)
- JDBC由浅入深解析(C3P0)(DBUtils)