PPT快速查重对比工具源码

查看 71|回复 9
作者:killerzeno   
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)

文件, 备注

zixiangcode   

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

感谢大佬分享
evahappy   

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

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

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


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

原来是这个作用啊
echoofw   

感谢大佬分享
清淡如风   

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

学习了,感谢大佬
您需要登录后才可以回帖 登录 | 立即注册

返回顶部