批量将ppt格式转为pptx格式

批量将ppt格式转为pptx格式

点点

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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
当下时代,PPT是十分常用的文件类型之一,成为我们生活与工作中的助力,有些小伙伴们不知道如何在PPT文档中插入Word文档,接下来小编就给小伙伴们介绍一下具体的操作步骤。
首页可以预览单个图片,但是是有大小限制的而且是单个查看。如果想批量查看的可以看下文章,有具体操作。
网络是有记忆的,有过联系就会留下痕迹,QQ十年前的好友删除了该怎样找回?嘿嘿,关注点点,让小伙伴们回到青春时的回忆!直接给小伙伴们上干货啦!跟着点点来!
我们经常会想要删除很久之前微信中的聊天图片和视频,也有很多是没有被我们清除的,但是很多小伙伴们都想要知道微信怎么清理图片和视频,想要彻底删除一些好友之间的聊天照片和视频,那么下面就让点点给小伙伴们介绍一下最新的方法。
在互联网的大时代,咱们都没有任何的隐私可言,我们在正规的网站浏览网页,过几个小时就会有客服给咱们打电话,各大平台也是给咱们推荐我们所浏览的东西。不买会一直给推荐,关掉个性设置,广告等还是会推荐。直到你购买,方才作罢。
在国外邮箱是他们常用的通讯方式,尤其是公司,在国内很多的小伙伴们基本不用,但是很多地方也是可以用到的,比如电子发票,合同内容或者是工资条的发放,邮箱也是有很多的小伙伴们都在使用的,有的小伙伴们在使用的时候就很好奇邮箱格式如何写才正确呢?
如果在没有wifi的情况下,我们接收qq信息就要流量。尤其是图片,QQ里加入的群很多,接收图片就很费流量。在这样的情况下我们可以设置屏蔽群图片,手机qq怎么设置屏蔽群图片呢?下面为小伙伴们介绍。
在21世纪,网络已经是生活中必不可少的部分,许许多多的小伙伴们逐步踏入互联网行业,因而也催生了许多职业,比如说网页编辑与制作,网络客服,短视频编辑及制作等等。