批量将ppt格式转为pptx格式

批量将ppt格式转为pptx格式

点点

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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
苹果手机iPhone家庭是一项共享功能,但是很多小伙伴们都是使用不到的,所以想要进行删除,但是不知道iPhone家庭可不可以删除,对此抱有疑问,也不会删除,那么下面就让小编给小伙伴们介绍一下删除方式。
通讯工具有很多,微信账号作为我们实时通讯最常用的软件账号,但是有很多小伙伴们会遇到各种体验不好的可能,所以会想要注销自己的微信账号,其中很多小伙伴们想要知道如何注销微信账号,如何注销微信账号?
从微信的授权、token、以及到js-sdk 开发。
这几天电信发生的大面积网络不能使用的问题,很多小伙伴在正常能上网时上不去,网络对于手机来说是至关重要的,有些小伙伴在使用iPhone手机的时候偶尔遇到无法上网问题,不知道如何解决,接下来小编就给小伙伴们介绍一下具体的操作步骤。
现在有很多企业都在使用钉钉办公,有些小伙伴们不知道电脑钉钉怎么设置OA审批人员,接下来小编就给小伙伴们介绍一下具体的操作步骤。
我们在使用微信聊天时免不了要发送图片,微信图片,删除后简单操作教你怎么找回它! 微信图片经常过期,或者被自己删除,但是又很重要,不得不给找回来,没有关系,我们可以试试下面的恢复方法,一定很有用!
随着科技的快速发展,人工智能(AI)已经在各个领域大放异彩。其中,AI换脸技术以其独特的魅力引起了广泛的关注。这项技术主要运用深度学习算法,通过分析人脸的几何结构,将生成的模型映射到另一张人脸图像上,实现人脸的巧妙转换。
在使用电脑时突然发现系统win10 c盘爆满,越来越卡,这关乎到小伙伴们的电脑运行以及系统流畅度,如果系统盘变成了红色爆满,那可以说电脑几乎就卡到无法运行了,因为各种临时文件都是需要在C盘中存储的,这里为小伙伴们带来C盘爆满的解决办法。