From da444ac8fdbe4dfdf2a8302abc4eb29571f9c06b Mon Sep 17 00:00:00 2001 From: lichaojun Date: Fri, 4 Oct 2024 01:37:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ppt=E8=BD=AC=E5=9B=BE=E7=89=87=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=8A=9F=E8=83=BD=E7=94=B1python=E4=BB=A3=E6=9B=BF?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E9=AB=98=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++++ config/index.js | 8 ++++--- package.json | 3 ++- py-src/config.py | 17 ++++++++++++++ py-src/del_ppt.py | 14 +++++------ py-src/ppt_to_img.py | 55 ++++++++++++++++++++++++++++++++++++++++++++ src/img_merge.js | 4 ++-- src/ppt_to_img.js | 2 +- 8 files changed, 93 insertions(+), 14 deletions(-) create mode 100644 py-src/config.py create mode 100644 py-src/ppt_to_img.py diff --git a/.gitignore b/.gitignore index c6bba59..30d6ed5 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,7 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + + +# Python +__pycache__/ diff --git a/config/index.js b/config/index.js index de37c5c..bccbdd1 100644 --- a/config/index.js +++ b/config/index.js @@ -1,8 +1,6 @@ const config = { //基础公共配置 base: { - // 指定要查找的目录 - directoryPath: 'E:/商品资料汇总/商品资料(1101-1150)', /** * 图片文件夹路径 * 1. 配置文件中inputDir为空 @@ -12,8 +10,12 @@ const config = { * 则直接使用inputDir作为工作目录 */ inputDir: '', + // 指定要查找的目录 + directoryPath: 'E:/商品资料汇总/商品资料(1101-1150)', // 要转换的文件个数, 0表示全部转换 - rangeNum: 15, + rangeNum: 20, + // directoryPath: 'C:/Users/Administrator/Desktop/测试', + // rangeNum: 3, }, // 裁剪商品封面图 cover: { diff --git a/package.json b/package.json index af1ac96..630147d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "ppt": "node ./src/ppt_to_img.js", "merge": "node ./src/img_merge.js", "water": "node ./src/water_market.js", - "pptToImg": "npm run ppt && npm run merge && npm run water && npm run cover" + "pptToImg": "npm run ppt && npm run merge && npm run water && npm run cover", + "pyToImg": "npm run merge && npm run water && npm run cover" }, "author": "", "license": "ISC", diff --git a/py-src/config.py b/py-src/config.py new file mode 100644 index 0000000..bf0b9d4 --- /dev/null +++ b/py-src/config.py @@ -0,0 +1,17 @@ +import os + + +class Config: + WORK_PATH = "E:/商品资料汇总/商品资料(1101-1150)" + # WORK_PATH = "C:/Users/Administrator/Desktop/测试" + + def get_latest_folder(base_directory): + folders = [ + os.path.join(base_directory, d) + for d in os.listdir(base_directory) + if os.path.isdir(os.path.join(base_directory, d)) + ] + if not folders: + return None + latest_folder = max(folders, key=os.path.getctime) # 获取最新创建的文件夹 + return latest_folder diff --git a/py-src/del_ppt.py b/py-src/del_ppt.py index a650cb7..95ceb7a 100644 --- a/py-src/del_ppt.py +++ b/py-src/del_ppt.py @@ -1,11 +1,9 @@ import os -import shutil from pptx import Presentation -from pptx.util import Inches -from PIL import Image +from config import Config # 指定包含PPT文件的文件夹 -folder_path = 'C:/Users/Administrator/Desktop/测试' +folder_path = "C:/Users/Administrator/Desktop/测试/ppt1010" def del_slide(presentation, slide_index): @@ -15,12 +13,12 @@ def del_slide(presentation, slide_index): :param slide_index: 索引 :return: 被删除的幻灯片对象 """ - slides = list(presentation.slides._sldIdLst) slide_to_delete = slides[slide_index] presentation.slides._sldIdLst.remove(slide_to_delete) return slide_to_delete # 返回被删除的幻灯片对象 + def delete_last_slide_from_ppt(ppt_path): """ 从PPT中删除最后一张幻灯片 @@ -35,15 +33,17 @@ def delete_last_slide_from_ppt(ppt_path): else: print(f"pptx文件中没有幻灯片: {ppt_path}") + def batch_delete_last_slides(directory): """ 批量删除每个PPT的最后一张幻灯片 :param directory: 文件夹路径 """ for filename in os.listdir(directory): - if filename.endswith('.pptx') or filename.endswith('.ppt'): + if filename.endswith(".pptx") or filename.endswith(".ppt"): ppt_path = os.path.join(directory, filename) delete_last_slide_from_ppt(ppt_path) + # 调用批量删除函数 -batch_delete_last_slides(folder_path) \ No newline at end of file +batch_delete_last_slides(Config.get_latest_folder(Config.WORK_PATH)) diff --git a/py-src/ppt_to_img.py b/py-src/ppt_to_img.py new file mode 100644 index 0000000..05b8048 --- /dev/null +++ b/py-src/ppt_to_img.py @@ -0,0 +1,55 @@ +import os +import win32com.client +from config import Config + + +# 初始化PPT +def init_powerpoint(): + powerpoint = win32com.client.Dispatch("PowerPoint.Application") + powerpoint.Visible = 1 + return powerpoint + + +# PPT转png +def ppt2png(pptFileName, downLoad_path, powerpoint): + try: + ppt_path = os.path.abspath(pptFileName) + ppt = powerpoint.Presentations.Open(ppt_path) + + # 保存为图片 + img_path = os.path.abspath(downLoad_path + ".png") + ppt.SaveAs(img_path, 18) # 18 为 PNG 格式 + + # 关闭打开的ppt文件 + ppt.Close() + except Exception as e: + print(f"PPT转png失败: {pptFileName}") + else: + print("PPT转png成功", pptFileName) + + +# 批量转换PPT文件 +def batch_convert_ppt_to_png(directory, output_directory): + powerpoint = init_powerpoint() + + # 遍历指定目录中的所有PPT和PPTX文件 + for filename in os.listdir(directory): + if filename.endswith(".ppt") or filename.endswith(".pptx"): + pptFileName = os.path.join(directory, filename) + downLoad_path = os.path.join( + output_directory, os.path.splitext(filename)[0] + ) # 不带扩展名的文件名 + ppt2png(pptFileName, downLoad_path, powerpoint) + + powerpoint.Quit() # 退出PowerPoint + + +# 示例用法 +if __name__ == "__main__": + # 获取最新创建的文件夹 + input_directory = Config.get_latest_folder(Config.WORK_PATH) + # 设置输出目录为 input_directory/img + output_directory = os.path.join(input_directory, "img") + # 创建输出文件夹 + os.makedirs(output_directory, exist_ok=True) + batch_convert_ppt_to_png(input_directory, output_directory) diff --git a/src/img_merge.js b/src/img_merge.js index 7981659..b6d040d 100644 --- a/src/img_merge.js +++ b/src/img_merge.js @@ -91,8 +91,8 @@ fs.readdirSync(merageImgDir, { withFileTypes: true }).forEach((imgDir) => { }); const sortImagePaths = imagePaths.sort((a, b) => { // 提取数字部分 - const numA = parseInt(a.match(/slide_(\d+)\.png/)[1], 10); - const numB = parseInt(b.match(/slide_(\d+)\.png/)[1], 10); + const numA = parseInt(a.match(/幻灯片(\d+)\.png/)[1], 10); + const numB = parseInt(b.match(/幻灯片(\d+)\.png/)[1], 10); return numA - numB; // 按数字排序 }); diff --git a/src/ppt_to_img.js b/src/ppt_to_img.js index 2a80724..59d9405 100644 --- a/src/ppt_to_img.js +++ b/src/ppt_to_img.js @@ -38,7 +38,7 @@ const convertPdfToImg = (inputDir, file) => { fs.mkdirSync(imgItemDir); } - const imageOutputPath = path.join(imgItemDir, 'slide_%d.png'); + const imageOutputPath = path.join(imgItemDir, '幻灯片%d.png'); const imgCmd = `magick -density 72 "${inputDir}" "${imageOutputPath}"`; console.log(imgCmd); execSync(imgCmd);