本帖最后由 killerzeno 于 2024-11-15 15:33 编辑
PPT快速查重对比工具源码
工具用途:快速查询对比两个PPT之间内容是否有差异,并在备注内注明差异页数,快速找出重复页,方便后续合并。
开发语言:Python 原贴链接:PPT快速查重对比工具
源码如下:
[Python] 纯文本查看 复制代码 import os
import tkinter as tk
from tkinter import filedialog, messagebox
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
def extract_text_from_slide(slide):
"""
提取幻灯片中的所有文本。
"""
texts = []
for shape in slide.shapes:
if shape.has_text_frame:
for paragraph in shape.text_frame.paragraphs:
for run in paragraph.runs:
texts.append(run.text)
elif shape.shape_type == MSO_SHAPE_TYPE.PLACEHOLDER:
if shape.has_text_frame:
for paragraph in shape.text_frame.paragraphs:
for run in paragraph.runs:
texts.append(run.text)
return ' '.join(texts)
def add_comment_to_slide(slide, comment):
"""
在指定幻灯片的备注中添加注释。如果已有备注,则替换为新的注释。
"""
if slide.has_notes_slide:
notes_slide = slide.notes_slide
else:
# 为当前幻灯片添加备注幻灯片
notes_slide = slide.notes_slide # 这里不需要赋值,直接使用属性即可
# 设置新的备注文本
notes_slide.notes_text_frame.text = comment
def compare_ppt_files(current_ppt_path, directory):
"""
比较当前打开的 PPT 文件与目录下的所有 PPT 文件的每一页。
如果找到重复的页面,则在当前 PPT 的备注中添加“重复: 与第 X 页重复”。
"""
current_prs = Presentation(current_ppt_path)
current_slides = [extract_text_from_slide(slide) for slide in current_prs.slides]
for filename in os.listdir(directory):
if filename.endswith(".pptx") and filename != os.path.basename(current_ppt_path):
other_prs_path = os.path.join(directory, filename)
other_prs = Presentation(other_prs_path)
other_slides = [extract_text_from_slide(slide) for slide in other_prs.slides]
for i, current_slide_text in enumerate(current_slides):
for j, other_slide_text in enumerate(other_slides):
if current_slide_text == other_slide_text:
print(f"找到重复页面: 当前PPT的第 {i + 1} 页 与 {filename} 的第 {j + 1} 页相同。")
add_comment_to_slide(current_prs.slides[i], f"重复: 与 {filename} 的第 {j + 1} 页重复")
break # 假设每页只标记一次重复
# 保存修改后的当前PPT,命名规则为“已做标记_原文件名”
base_name = os.path.basename(current_ppt_path)
output_path = os.path.join(directory, "已做标记_" + base_name)
current_prs.save(output_path)
print(f"修改后的PPT已保存为: {output_path}")
def select_ppt_file():
"""
弹出文件选择对话框,让用户选择要比较的PPT文件。
"""
root = tk.Tk()
root.withdraw() # 隐藏主窗口
messagebox.showinfo("提示", "请选择待对比的PPT文件,并确保原始文件在同目录下。")
file_path = filedialog.askopenfilename(
title="选择待对比的PPT文件",
filetypes=[("PowerPoint files", "*.pptx")]
)
return file_path
def select_save_directory():
"""
弹出目录选择对话框,让用户选择保存修改后的PPT文件的目录。
"""
root = tk.Tk()
root.withdraw() # 隐藏主窗口
messagebox.showinfo("提示", "请选择保存修改后PPT文件的目录。")
directory = filedialog.askdirectory(title="选择保存修改后PPT文件的目录")
return directory
if __name__ == "__main__":
# 弹出文件选择对话框,让用户选择要比较的PPT文件
current_ppt_path = select_ppt_file()
if not current_ppt_path:
messagebox.showerror("错误", "未选择要比较的PPT文件。")
exit()
# 弹出目录选择对话框,让用户选择保存修改后PPT文件的目录
directory = select_save_directory()
if not directory:
messagebox.showerror("错误", "未选择保存修改后PPT文件的目录。")
exit()
# 检查文件是否存在
if not os.path.exists(current_ppt_path):
messagebox.showerror("错误", f"文件不存在: {current_ppt_path}")
exit()
# 比较PPT文件
compare_ppt_files(current_ppt_path, directory) |