PPT到PDF转换器:一个功能强大的Python GUI应用(unzip,convert,replace,merge)

news2024/11/26 11:30:49

在当今的数字时代,文档格式转换已成为一项常见需求。特别是将PowerPoint演示文稿转换为PDF格式,这不仅可以确保文档的一致性,还能方便分享和打印。今天,我们将深入探讨一个使用Python开发的强大GUI应用程序,它不仅可以将PPT转换为PDF,还具备文本替换、PDF处理和文件合并等多项功能。
C:\pythoncode\new\unzipconvertpdfmerge.py

应用概述

这个应用程序主要完成以下任务:

  1. 解压7z压缩文件
  2. 在PPT文件中替换指定文本
  3. 将PPT文件转换为PDF
  4. 处理生成的PDF文件(删除最后一页,更新公司名称)
  5. 合并所有PDF文件

让我们逐步解析这个应用的核心组件和功能。

全部代码

import os
import wx
import fitz  # PyMuPDF
import py7zr
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
from PyPDF2 import PdfMerger
import comtypes.client
import pythoncom

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="PPT to PDF Converter", size=(500, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        self.dir_picker = wx.DirPickerCtrl(panel, message="Choose a destination folder")
        vbox.Add(self.dir_picker, flag=wx.EXPAND | wx.ALL, border=10)

        self.input_box1 = wx.TextCtrl(panel, value="Enter text to replace")
        vbox.Add(self.input_box1, flag=wx.EXPAND | wx.ALL, border=10)

        self.input_box2 = wx.TextCtrl(panel, value="Enter replacement text")
        vbox.Add(self.input_box2, flag=wx.EXPAND | wx.ALL, border=10)

        self.unzip_button = wx.Button(panel, label="Unzip and Convert")
        vbox.Add(self.unzip_button, flag=wx.EXPAND | wx.ALL, border=10)
        self.unzip_button.Bind(wx.EVT_BUTTON, self.on_unzip_convert)

        panel.SetSizer(vbox)

    def on_unzip_convert(self, event):
        destination_dir = self.dir_picker.GetPath()
        text_to_replace = self.input_box1.GetValue()
        replacement_text = self.input_box2.GetValue()

        with wx.FileDialog(self, "Choose a 7z file", wildcard="7z files (*.7z)|*.7z", style=wx.FD_OPEN) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return

            zip_path = fileDialog.GetPath()

        # Step 1: Unzip the 7z file
        with py7zr.SevenZipFile(zip_path, mode='r') as archive:
            archive.extractall(path=destination_dir)

        # Step 2: Process all PPT files
        pdf_files = []
        for root, dirs, files in os.walk(destination_dir):
            for file in files:
                if file.endswith('.pptx'):
                    ppt_path = os.path.join(root, file)
                    pdf_path = os.path.splitext(ppt_path)[0] + ".pdf"
                    
                    # Replace text in PPT
                    self.replace_text_in_ppt(ppt_path, text_to_replace, replacement_text)
                    
                    # Convert PPT to PDF
                    self.convert_ppt_to_pdf(ppt_path, pdf_path)
                    
                    # Process the PDF (remove last page, update company name)
                    self.process_pdf(pdf_path, replacement_text)
                    pdf_files.append(pdf_path)

        # Step 3: Merge all PDFs
        self.merge_pdfs(pdf_files, os.path.join(destination_dir, "merge.pdf"))
        wx.MessageBox("Process completed!", "Info", wx.OK | wx.ICON_INFORMATION)

    def replace_text_in_ppt(self, ppt_path, old_text, new_text):
        prs = Presentation(ppt_path)
        for slide in prs.slides:
            for shape in slide.shapes:
                if shape.shape_type == MSO_SHAPE_TYPE.TEXT_BOX:
                    if shape.text_frame and old_text in shape.text:
                        shape.text = shape.text.replace(old_text, new_text)
        prs.save(ppt_path)

    def convert_ppt_to_pdf(self, ppt_path, pdf_path):
        # Start PowerPoint application
        powerpoint = comtypes.client.CreateObject("PowerPoint.Application")
        powerpoint.Visible = 1

        # Open the PowerPoint file
        presentation = powerpoint.Presentations.Open(ppt_path)

        # Save as PDF
        presentation.SaveAs(pdf_path, 32)  # 32 is the enum value for PDF format
        presentation.Close()

        # Quit PowerPoint application
        powerpoint.Quit()

    def process_pdf(self, pdf_path, company_name):
        doc = fitz.open(pdf_path)
        
        # Remove the last page
        if len(doc) > 1:
            doc.delete_page(len(doc) - 1)

        # Modify the first page's company name
        page = doc[0]
        text_instances = page.search_for(company_name)
        if text_instances:
            for inst in text_instances:
                rect = inst.rect
                page.insert_text((rect.x0, rect.y0), company_name, fontsize=12, color=(0, 0, 0))

        doc.saveIncr()  # Save changes to the same file
        doc.close()

    def merge_pdfs(self, pdf_files, output_path):
        merger = PdfMerger()
        for pdf in pdf_files:
            merger.append(pdf)
        merger.write(output_path)
        merger.close()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame()
        frame.Show()
        return True

app = MyApp()
app.MainLoop()

核心组件

1. 图形用户界面(GUI)

应用使用wxPython库创建了一个简单而功能强大的GUI。主要包含以下元素:

  • 目录选择器:用于选择输出目录
  • 两个文本输入框:分别用于输入要替换的文本和替换后的文本
  • "解压并转换"按钮:启动整个处理流程
class MyFrame(wx.Frame):
    def __init__(self):
        # ... (GUI 初始化代码)

2. 7z文件解压

使用py7zr库实现7z文件的解压:

with py7zr.SevenZipFile(zip_path, mode='r') as archive:
    archive.extractall(path=destination_dir)

3. PPT文本替换

利用python-pptx库在PPT文件中进行文本替换:

def replace_text_in_ppt(self, ppt_path, old_text, new_text):
    prs = Presentation(ppt_path)
    for slide in prs.slides:
        for shape in slide.shapes:
            if shape.shape_type == MSO_SHAPE_TYPE.TEXT_BOX:
                if shape.text_frame and old_text in shape.text:
                    shape.text = shape.text.replace(old_text, new_text)
    prs.save(ppt_path)

4. PPT到PDF的转换

使用comtypes库调用PowerPoint应用程序进行转换:

def convert_ppt_to_pdf(self, ppt_path, pdf_path):
    powerpoint = comtypes.client.CreateObject("PowerPoint.Application")
    presentation = powerpoint.Presentations.Open(ppt_path)
    presentation.SaveAs(pdf_path, 32)  # 32 对应PDF格式
    presentation.Close()
    powerpoint.Quit()

5. PDF处理

使用PyMuPDF(fitz)库处理PDF文件:

def process_pdf(self, pdf_path, company_name):
    doc = fitz.open(pdf_path)
    if len(doc) > 1:
        doc.delete_page(len(doc) - 1)
    page = doc[0]
    text_instances = page.search_for(company_name)
    if text_instances:
        for inst in text_instances:
            rect = inst.rect
            page.insert_text((rect.x0, rect.y0), company_name, fontsize=12, color=(0, 0, 0))
    doc.saveIncr()
    doc.close()

6. PDF合并

使用PyPDF2库合并多个PDF文件:

def merge_pdfs(self, pdf_files, output_path):
    merger = PdfMerger()
    for pdf in pdf_files:
        merger.append(pdf)
    merger.write(output_path)
    merger.close()

工作流程

  1. 用户选择7z文件和输出目录,输入要替换的文本。
  2. 点击"解压并转换"按钮后,程序解压7z文件。
  3. 遍历所有PPT文件,进行以下操作:
    • 替换指定文本
    • 转换为PDF
    • 处理生成的PDF(删除最后一页,更新公司名称)
  4. 最后,将所有处理过的PDF合并为一个文件。

技术亮点

  1. 多库协作: 利用多个Python库(wxPython, py7zr, python-pptx, comtypes, PyMuPDF, PyPDF2)协同工作,实现复杂功能。
  2. 自动化办公: 实现了从PPT文本替换到PDF转换和处理的全自动化流程。
  3. 用户友好: 提供了直观的GUI,使非技术用户也能轻松操作。
  4. 可扩展性: 模块化的设计使得添加新功能变得简单。

结果如下

在这里插入图片描述

总结

这个Python应用展示了如何将多个复杂的文档处理任务整合到一个用户友好的界面中。它不仅提高了工作效率,还为类似的文档处理任务提供了一个可扩展的框架。无论是对于日常办公还是大规模文档处理,这种自动化工具都能带来显著的效率提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TDesign 微信小程序组件库配置

文章目录 1.安装 npm 包2. 构建 npm3. 构建完成后即可使用 npm 包。4.修改 app.json5.修改 tsconfig.json6.使用组件 1.安装 npm 包 在小程序 package.json 所在的目录中执行命令安装 npm 包: npm install结果报错 PS C:\WeChatProjects\miniprogram-1> npm i…

七、库存管理——调拨、预留业务

1、库存管理业务总览 2、转储过账和库存转移 3、转储过账 3.1 库存状态到库存状态(类型较多) 3.1.1 从质检库存转移到非限制使用库存 转储模式:事务类型A08(转移过账)凭证类型R10(其他)移动类…

Having trouble using OpenAI API

题意:"使用OpenAI API遇到困难" 问题背景: I am having trouble with this code. I want to implement AI using OpenAI API in my React.js project but I cannot seem to get what the issue is. I ask it a question in the search bar in…

java 教程-我的第一个JAVA程序

Java视频教程 我的第一个JAVA程序 以下我们通过一个简单的实例来展示Java编程,本实例输出"编程字典,Java教程!",这也是所有语言入门的第一个实例程序: packagecodingdict.com; publicclassHelloWorld{ publi…

REGTR: End-to-end Point Cloud Correspondences with Transformers 论文解读

目录 一、导言 二、先导知识 1、3DRegNet 2、Kabsch-Umeyama算法 3、InfoNCE损失函数 三、相关工作 1、基于对应关系的配准 2、全局配准工作 3、过滤问题 4、Transformer 四、REGTR网络 1、降采样和特征提取 2、Transformer 交叉编码器 Transformer为什么要用FF…

MySQL高阶练习题2-没有广告的剧集

目录 题目 准备数据 分析数据 实现代码 总结 题目 找出所有没有广告出现过的剧集。 返回结果 无顺序要求 。 准备数据 create database db; use db;Create table If Not Exists Playback(session_id int,customer_id int,start_time int,end_time int); Create table I…

数据结构:(LeetCode 965)相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&…

「草莓」即将上线,OpenAI新旗舰大模型曝光,代号「猎户座」

本月初,OpenAI 创始人、CEO 山姆・奥特曼突然在 X 上发了一张照片,勾起了大家强烈的好奇心。 「四个红草莓,其中还有一个未成熟的青色草莓,这不妥妥地是在说下一代 AI 大模型 GPT-5 要来了吗?」奥特曼在回应网友时也在暗示,惊喜马上就来。 据科技媒体 The Information 报…

前胡基因组与伞形科香豆素的进化-文献精读42

The gradual establishment of complex coumarin biosynthetic pathway in Apiaceae 伞形科中复杂香豆素生物合成途径的逐步建立 羌活基因组--文献精读-36 摘要:复杂香豆素(CCs)是伞形科植物中的特征性代谢产物,具有重要的药用价…

JAVA:文字写入图片、图片插入图片

一、前言 在实际应用中,需要通过Java将目标信息写在图片上,生成小卡片。 二、实现 1.定义一个工具类,代码如下: import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.Fil…

C++(1)基础语法

C(1)之基础语法 Author: Once Day Date: 2024年8月29日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 参考文…

使用控制台与键盘进行输入输出

1、控制台简介与初始化 计算机在上电启动后,显示器被默认配置成80x25列的文本显示模式 。其使用从0xb8000开始,一共32KB的显存用于显示。如要在屏幕上指定位置显示特定的字符,则只需找到该位置对应的显存地址,写入2字节的数据&am…

ctfshow之web58~web71

目录 web58 思路一: 思路二: 思路三: web59~web65 web66~web67 web68~web70 web71 web58 if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); } PHP eval() 函数介绍 定义和用法 eval() 函数把字符串按…

【Sceneform-EQR】通过filament(gltfio)加载gltf模型动画(Filament使用Animator)

Sceneform-EQR 简介 Sceneform-EQR是EQ基于sceneform(filament)扩展的一个用于安卓端的三维渲染器。 相关链接 Git仓库 Sceneform-EQR 码云 EQ-Renderer的示例工程 EQ-R相关文档 文档目录CSDN专栏 实现通过filament加载gltf模型动画 运行示例 …

U盘无法访问?揭秘原因与高效恢复策略

一、U盘困境深度剖析 在日常的数字生活中,U盘作为我们存储和传输数据的重要工具,其重要性不言而喻。然而,当U盘突然显示“无法访问”时,这种突如其来的困境往往让人措手不及。U盘无法访问的现象可能由多种原因造成,包…

Question mutiple pdf‘s using openai, pinecone, langchain

题意:使用 OpenAI、Pinecone 和 LangChain 对多个 PDF 文件进行提问。 问题背景: I am trying to ask questions against a multiple pdf using pinecone and openAI but I dont know how to. 我正在尝试使用 Pinecone 和 OpenAI 对多个 PDF 文件进行提…

ssh远程连接服务

1、概述 一种安全访问远程服务器的协议,远程管理工具,通过加密方式管理连接,使服务器更安全。 2、加密算法 对称加密 发送密码前将密码数据加密成密文,然后发送出去 接收方收到密文后,使用同一个密钥将密文解密。…

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述 基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同步…

《软件工程导论》(第6版)第5章 总体设计 复习笔记

第5章 总体设计 一、总体设计概念 1.定义 总体设计的基本目的就是回答“系统应该如何实现”这个问题,总体设计又称为概要设计或初步设计。 2.主要任务 (1)划分出组成系统的物理元素程序、文件、数据库、人工过程…

大模型种草书籍——BERT基础教程:Transformer大模型实战,看完头皮发麻!

《BERT基础教程:Transformer大模型实战》 是一本专注于介绍自然语言处理(NLP)领域的先进技术——BERT(Bidirectional Encoder Representations from Transformers)及其应用的教程书籍。 以下是这本书的简要介绍&#…