killerzeno 发表于 2024-11-15 15:30

PPT快速查重对比工具源码

本帖最后由 killerzeno 于 2024-11-15 15:33 编辑

PPT快速查重对比工具源码


工具用途:快速查询对比两个PPT之间内容是否有差异,并在备注内注明差异页数,快速找出重复页,方便后续合并。
开发语言:Python原贴链接:PPT快速查重对比工具
源码如下:


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 =

    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 =

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

zixiangcode 发表于 2024-11-15 18:54

那能否据此写一个提取 PPT 信息然后扔到 git 里面去 diff 的工具,自动从 PPT 转换成元信息 diff 后再转换回去,并处理 diff 的信息🤔
不过这似乎直接用 WPS 的在线文档就好🤓
总之谢谢楼主分享

isolato 发表于 2024-11-15 16:26

感谢大佬分享

evahappy 发表于 2024-11-15 16:29

这个正好需要,叫兄弟改的 ,后面自己都不知道改哪里了。这样就好办了

china-ray 发表于 2024-11-15 16:46

这个不错,日常办公应该会用到,感谢分享!

宁致远 发表于 2024-11-15 16:55

做PPT的时候可以用到,能提高效率就是好的!!!

热门软件 发表于 2024-11-15 17:12

evahappy 发表于 2024-11-15 16:29
这个正好需要,叫兄弟改的 ,后面自己都不知道改哪里了。这样就好办了

原来是这个作用啊

echoofw 发表于 2024-11-15 17:26

感谢大佬分享

清淡如风 发表于 2024-11-15 17:48

学习了,这样的代码多多益善!

Su117978228 发表于 2024-11-15 18:31

学习了,感谢大佬
页: [1] 2
查看完整版本: PPT快速查重对比工具源码