批量将ppt格式转为pptx格式

批量将ppt格式转为pptx格式

点点

2021-03-25 09:06 阅读 496 喜欢 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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
微信收款码是分为个人码和商家码两种,虽然看似差不多,但其实功能上是有差别的。商家收款码不仅支持顾客使用信用卡支付,还可以享受直接提现等便利功能。那么微信商家收款码怎么申请?第一步商户需要开通微信收款商业版。
平常生活中,我们很多的时候都会用到电脑,现在大部分电脑都是win10系统,有些用户遇到了无法安装软件问题,想知道如何解决?跟小编来。
现在电脑与手机普及的当下,还有很多的小伙伴不会查看自己电脑的位数,今天就为小伙伴们介绍了什么是32位与64位操作系统以及32位与64位系统的区别,这里忽然想到了一个问题,就是怎么看电脑是多少位系统呢?
有个小功能需要一些基础数据,想着把这些数据爬一些下来做为基础数据使用的。本来还想着直接反编译小程序的,没想到它变更了加密方式,以前反编译的路子走不通了,尝试抓下数据看能不能拿到了。
我们日常生活,工作中,会经常用微信接收和发送一些重要文件,那么微信电脑版下载文件在哪,电脑文件夹怎么发送到微信,会有很多小伙伴为此困扰,小编今天就和小伙伴们一起看一下吧。
在日常生活中经常会用到电脑,使用电脑访问网页的过程中,小伙伴们可能会收到一个“404 not found”提醒,那么这是什么意思呢?出现这个问题的原因是什么?该如何解决哪?
在短视频兴起的时代,一款好用的视频剪辑工具是我们必备的,而目前剪映有电脑版的软件可以供小伙伴使用了。如果遇到了拥有非常好听的背景音乐的视频文件,那么此时我们应该怎么将视频中的音频分离出来呢?
手机上的微信支付是一款常用的聊天社交、支付应用,是我们生活中必不可少的应用,那我们在使用微信支付的过程中遇到了支付受限的问题,这是为什么呢,最长多久可以解封恢复使用,下面就和点点一起来看看吧!