feat: ppt转图片部分功能由python代替,提高速度

main
lichaojun 1 year ago
parent 12c3233bea
commit da444ac8fd

4
.gitignore vendored

@ -128,3 +128,7 @@ dist
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# Python
__pycache__/

@ -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: {

@ -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",

@ -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

@ -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)
batch_delete_last_slides(Config.get_latest_folder(Config.WORK_PATH))

@ -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)

@ -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; // 按数字排序
});

@ -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);

Loading…
Cancel
Save