[亲妈版]Python批量将PPT转换为PPTX
前言:
【[亲妈版]Python批量将PPT转换为PPTX】本文基于Python语言环境实现,以及vsCode工具开发完成,可以支持ppt转pptx 或 pptx转ppt pdf png 等格式。
正式开发:
1、安装reportlab模块
#安装reportlab模块
pip3 install reportlab
2、安装win32com模块
第一种:
pip3 install pywin32
第二种:
python -m pip install --upgrade pip -i https://pypi.douban.com/simple
3、创建pptToPptx.py
import os
import loggingfrom reportlab.lib.pagesizes import A4, landscape
from reportlab.pdfgen import canvas
import win32com.clientlogger = 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 resclass pptTrans:
def __init__(self, infoDict, filePath):
self.infoDict = infoDict
self.filePath = filePath
self.powerpoint = Noneself.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.ppsaveasfiletypeinfoDict = 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('不是文件夹,也不是文件')
returnfor 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)
dirPath += "/pptx"
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 = Noneself.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 outputFileNamedef 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('不是文件夹,也不是文件')
returnfor 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=https://www.it610.com/article/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)
4、运行Py文件
第一种:cmd运行 找到文件目录输入:python pptToPptx.py
第二种:VSCode软件,配置python环境,运行 5、选择序号,输入文件夹路径即可。
6、到所输入文件夹路径下的pptx文件下查看所有转换成功的文件
7、完成,有帮助,记得点赞,感谢!
感谢借鉴文章作者:https://developer.aliyun.com/...
推荐阅读
- 为什么 Python 3 把 print 改为函数()
- Python 高速增长的三次历史机遇
- 当 Python 中混进一只薛定谔的猫……
- 三行Python代码,实现数据库和excel之间的导入导出!
- 30 个Python代码实现的常用功能(附案例源码)
- 只需四步,让你了解Python装饰器的诞生过程
- Python用ARIMA ,ARIMAX预测商店商品销售需求时间序列数据
- 深度辨析 Python 的 eval() 与 exec()
- Python中tuple+=赋值的四个问题
- pythonnohup python 提示 ImportError: No module named requests