批量将ppt格式转为pptx格式

批量将ppt格式转为pptx格式

点点

2021-03-25 09:06 阅读 518 喜欢 0

如何将大量的ppt格式的文件批量转化为pptx格式的文件呢。

如果只有一两个,可以通过高版本的powerpoint软件直接打开ppt然后另存为pptx格式即可,但是如果是几百上千个文件,估计大部分人都会来找工具了。

可以通过python来调用本地的powerpoint来另存,代替我们手工保存。 在github上找了一个工具,可以支持ppt转pptx 或 pptx转ppt pdf png 等格式。

app.py

安装reportlab模块

pip3 install reportlab 将以下内容复制,保存在app.py文件中,当然,前提需要安装python环境,我本地安装的3.x .

-- coding: utf-8 --

""" @author: liuzhiwei @Date: 2020/11/15 """

import os import logging

from reportlab.lib.pagesizes import A4, landscape from reportlab.pdfgen import canvas import win32com.client

logger = logging.getLogger('Sun') logging.basicConfig(level=20, # format="[%(name)s][%(levelname)s][%(asctime)s] %(message)s", format="[%(levelname)s][%(asctime)s] %(message)s", datefmt='%Y-%m-%d %H:%M:%S' # 注意月份和天数不要搞乱了,这里的格式化符与time模块相同 )

def getFiles(dir, suffix, ifsubDir=True): # 查找根目录,文件后缀 res = [] for root, directory, files in os.walk(dir): # =>当前根,根下目录,目录下的文件 for filename in files: name, suf = os.path.splitext(filename) # =>文件名,文件后缀 if suf.upper() == suffix.upper(): res.append(os.path.join(root, filename)) # =>吧一串字符串组合成路径 if False is ifsubDir: break return res

class pptTrans: def init(self, infoDict, filePath): self.infoDict = infoDict self.filePath = filePath self.powerpoint = None

    self.init_powerpoint()
    self.convert_files_in_folder(self.filePath)
    self.quit()
    os.system('pause')

def quit(self):
    if None is not self.powerpoint:
        self.powerpoint.Quit()

def init_powerpoint(self):
    try:
        self.powerpoint = win32com.client.DispatchEx("Powerpoint.Application")
        self.powerpoint.Visible = 2
    except Exception as e:
        logger.error(str(e))

def ppt_trans(self, inputFileName):
    # https://docs.microsoft.com/en-us/office/vba/api/powerpoint.ppsaveasfiletype

    infoDict = self.infoDict
    formatType = infoDict['formatType']
    outputFileName = self.getNewFileName(infoDict['name'], inputFileName)

    if '' == outputFileName:
        return
    inputFileName = inputFileName.replace('/', '\\')
    outputFileName = outputFileName.replace('/', '\\')
    if '' == outputFileName:
        return
    if None is self.powerpoint:
        return
    powerpoint = self.powerpoint
    logger.info('开始转换:[{0}]'.format(inputFileName))
    deck = powerpoint.Presentations.Open(inputFileName)

    try:
        deck.SaveAs(outputFileName, formatType)  # formatType = 32 for ppt to pdf
        logger.info('转换完成:[{0}]'.format(outputFileName))
    except Exception as e:
        logger.error(str(e))
    deck.Close()

def convert_files_in_folder(self, filePath):
    if True is os.path.isdir(filePath):
        dirPath = filePath
        files = os.listdir(dirPath)
        pptfiles = [f for f in files if f.endswith((".ppt", ".pptx"))]
    elif True is os.path.isfile(filePath):
        pptfiles = [filePath]
    else:
        self.logError('不是文件夹,也不是文件')
        return

    for pptfile in pptfiles:
        fullpath = os.path.join(filePath, pptfile)
        self.ppt_trans(fullpath)

def getNewFileName(self, newType, filePath):
    try:
        dirPath = os.path.dirname(filePath)
        baseName = os.path.basename(filePath)
        fileName = baseName.rsplit('.', 1)[0]
        suffix = baseName.rsplit('.', 1)[1]
        if newType == suffix:
            logger.warning('文档[{filePath}]类型和需要转换的类型[{newType}]相同'.format(filePath=filePath, newType=newType))
            return ''
        newFileName = '{dir}/{fileName}.{suffix}'.format(dir=dirPath, fileName=fileName, suffix=newType)
        if os.path.exists(newFileName):
            newFileName = '{dir}/{fileName}_new.{suffix}'.format(dir=dirPath, fileName=fileName, suffix=newType)
        return newFileName
    except Exception as e:
        logger.error(str(e))
        return ''

class pngstoPdf: def init(self, infoDict, filePath): self.infoDict = infoDict self.powerpoint = None

    self.init_powerpoint()
    self.convert_files_in_folder(filePath)
    self.quit()
    os.system('pause')

def quit(self):
    if None is not self.powerpoint:
        self.powerpoint.Quit()

def init_powerpoint(self):
    try:
        self.powerpoint = win32com.client.DispatchEx("Powerpoint.Application")
        self.powerpoint.Visible = 2
    except Exception as e:
        logger.error(str(e))

def ppt_trans(self, inputFileName):
    # https://docs.microsoft.com/en-us/office/vba/api/powerpoint.ppsaveasfiletype
    infoDict = self.infoDict
    formatType = infoDict['formatType']
    outputFileName = self.getNewFolderName(inputFileName)

    if '' == outputFileName:
        return ''
    inputFileName = inputFileName.replace('/', '\\')
    outputFileName = outputFileName.replace('/', '\\')
    if '' == outputFileName:
        return ''
    if None is self.powerpoint:
        return ''
    powerpoint = self.powerpoint
    logger.info('开始转换:[{0}]'.format(inputFileName))
    deck = powerpoint.Presentations.Open(inputFileName)

    try:
        deck.SaveAs(outputFileName, formatType)
        logger.info('转换完成:[{0}]'.format(outputFileName))
    except Exception as e:
        logger.error(str(e))
        return ''
    deck.Close()
    return outputFileName

def convert_files_in_folder(self, filePath):
    if True is os.path.isdir(filePath):
        dirPath = filePath
        files = os.listdir(dirPath)
        pptfiles = [f for f in files if f.endswith((".ppt", ".pptx"))]
    elif True is os.path.isfile(filePath):
        pptfiles = [filePath]
    else:
        self.logError('不是文件夹,也不是文件')
        return

    for pptfile in pptfiles:
        fullpath = os.path.join(filePath, pptfile)
        folderName = self.ppt_trans(fullpath)
        try:
            self.png_to_pdf(folderName)
        except Exception as e:
            logger.error(str(e))
        for file in os.listdir(folderName):
            os.remove('{0}\\{1}'.format(folderName, file))
        os.rmdir(folderName)

def png_to_pdf(self, folderName):
    picFiles = getFiles(folderName, '.png')
    pdfName = self.getFileName(folderName)

    '''多个图片合成一个pdf文件'''
    (w, h) = landscape(A4)  #
    cv = canvas.Canvas(pdfName, pagesize=landscape(A4))
    for imagePath in picFiles:
        cv.drawImage(imagePath, 0, 0, w, h)
        cv.showPage()
    cv.save()

def getFileName(self, folderName):
    dirName = os.path.dirname(folderName)
    folder = os.path.basename(folderName)
    return '{0}\\{1}.pdf'.format(dirName, folder)

def getNewFolderName(self, filePath):
    index = 0
    try:
        dirPath = os.path.dirname(filePath)
        baseName = os.path.basename(filePath)
        fileName = baseName.rsplit('.', 1)[0]

        newFileName = '{dir}/{fileName}'.format(dir=dirPath, fileName=fileName)
        while True:
            if os.path.exists(newFileName):
                newFileName = '{dir}/{fileName}({index})'.format(dir=dirPath, fileName=fileName, index=index)
                index = index + 1
            else:
                break
        return newFileName
    except Exception as e:
        logger.error(str(e))
        return ''

if name == "main": transDict = {} transDict.update({1: {'name': 'pptx', 'formatType': 11}}) transDict.update({2: {'name': 'ppt', 'formatType': 1}}) transDict.update({3: {'name': 'pdf', 'formatType': 32}}) transDict.update({4: {'name': 'png', 'formatType': 18}}) transDict.update({5: {'name': 'pdf(不可编辑)', 'formatType': 18}})

hintStr = ''
for key in transDict:
    hintStr = '{src}{key}:->{type}\n'.format(src=hintStr, key=key, type=transDict[key]['name'])

while True:
    print(hintStr)
    transFerType = int(input("转换类型:"))
    if None is transDict.get(transFerType):
        logger.error('未知类型')
    else:
        infoDict = transDict[transFerType]
        path = input("文件路径:")
        if 5 == transFerType:
            pngstoPdf(infoDict, path)
        else:
            op = pptTrans(infoDict, path)

然后执行命令,选择序号,输入文件夹路径即可。

python app.py 静静等待程序自动转化即可。

转载请注明出处: http://sdxlp.cn/article/批量转换.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
我们在使用Excel办公的时候,有时候需要利用函数对单个区域排名,那么具体该如何操作呢?下面小编就为小伙伴们详细介绍一下,来看看吧!
随着网络普及,视频、语音聊天成了小伙伴们又一种不可或缺的通讯方式,但是很多的时候,会出现这样或者那样的问题,用QQ语音聊天时对方听不到我的声音,而我能听到对方的声音。针对这个问题,作如下详细解答,帮助小伙伴们轻松解决这个难题。
日常生活中,我们经常使用微信,在微信聊天中我们经常会发一些照片给好友,但是有时候会碰到微信无法加载图片的情况出现,导致浏览不了图片的内容,怎么办呢?因此小编总结了一些处理微信无法加载图片的方法,下面就分享给小伙伴们,希望对小伙伴们有所帮助的。
U盘使用过程中,莫名其妙的问题还是有很多的,其中最奇怪的就是出现U盘拒绝访问的问题,然后就无法打开U盘了,里面的资料也拷贝不出来,不用花钱,一招搞定。一招让u盘重获新生,千万不要拿去换新。u盘无法访问如何解决?
关于js的编译和压缩,之前做过一个小工具了,主要就是自己项目成员大都没有这部分的技能,导致发布的时候总需要去编译压缩下
现在有很多企业都在使用钉钉办公,有些小伙伴嘛呢不知道电脑钉钉怎么设置OA审批人员,接下来小编就给小伙伴们介绍一下具体的操作步骤。
一个切小图标的方法
日常生活中,我们经常用到微信,微信退了忘记了密码咋办?那么如何才能在不知道原始密码的情况下重置密码呢?