Python实现PDF合并工具(含源码)

2023-11-20

在工作中,每个月都会要遇到报账的情况,在现如今很多都是使用电子发票,获得的电子发票很多都是PDF格式,偶尔也有图片格式的。而且还是一张发票一个pdf文档,在打印贴票时,就需要一个文档一个文档的打开打印,十分的不便捷。

当然也可以使用某某PDF的编辑工具,把文档合并成一个文档。找了好几个工具不是有广告,就是要收费(有钱人,请飘过)。操,求人不如求己,自己搞一个。

1.选择文件夹

        点击选择文件夹后,选择文件,文件夹选择后,按钮变为合并功能

    def btn_click(self, event):
        id = event.GetId()
        if id == 5:
            btn_lab = self.btn.GetLabelText()
            if btn_lab == '选择':
                dlg = wx.DirDialog(self, u"选择文件夹", style=wx.DD_DEFAULT_STYLE)
                if dlg.ShowModal() == wx.ID_OK:
                    self.folder_path = dlg.GetPath()  # 文件夹路径
                dlg.Destroy()
                self.txt.SetLabelText("选择路径:" + self.folder_path)
                self.btn.SetLabelText('合并')
            else:
                self.txt.SetLabelText('合并开始...')
                self.pdf_merge()
                self.txt.SetLabelText('合并完成:' + os.path.join(self.folder_path, 'pdf_merge.pdf'))
                self.btn.SetLabelText('选择')

 2.找到所有的pdf文件

    def pdf_file_list(self):
        """
        获取文件夹中所有的.pdf类型的文件路径,包含子文件夹
        :return:
        """
        # 判断文件夹路径是否存在
        assert os.path.exists(self.folder_path), 'The folder path does not exist'
        pdf_paths = list()
        for root, dirs, files in os.walk(self.folder_path):
            for file in files:
                if file.endswith('.pdf'):
                    pdf_paths.append(os.path.join(root, file))
        return pdf_paths

3.合并文件并输出 

    def pdf_merge(self, merge_name='pdf_merge.pdf'):
        """

        :param merge_name: 合并后的文件名
        :return:
        """
        print('PDF合并开始...')
        pdf_lst = self.pdf_file_list()
        file_merger = PdfFileMerger()
        for pdf in pdf_lst:
            # 合并pdf文件
            file_merger.append(pdf)

        # 合并后的文件导出
        file_merger.write(os.path.join(self.folder_path, merge_name))
        print('PDF合并完成')

4. 附完整代码

import wx
import os
from PyPDF2 import PdfFileMerger


class PDFGuiFrame(wx.Frame):
    """
    @描述:PDF合并工具
    @作者: MAX
    """

    def __init__(self, folderPath='./'):
        self.folder_path = folderPath
        super().__init__(None, title='PDF合并工具', size=(400, 100))
        self.Center()
        # 创建一个面板
        panel = wx.Panel(parent=self)
        # 面板中添加一个文本控件
        self.txt = wx.StaticText(parent=panel, label="默认路径:" + self.folder_path)
        self.btn = wx.Button(parent=panel, label='选择', id=5, pos=(150, 20))
        self.Bind(wx.EVT_BUTTON, self.btn_click, None, id=5)

    def btn_click(self, event):
        id = event.GetId()
        if id == 5:
            btn_lab = self.btn.GetLabelText()
            if btn_lab == '选择':
                dlg = wx.DirDialog(self, u"选择文件夹", style=wx.DD_DEFAULT_STYLE)
                if dlg.ShowModal() == wx.ID_OK:
                    self.folder_path = dlg.GetPath()  # 文件夹路径
                dlg.Destroy()
                self.txt.SetLabelText("选择路径:" + self.folder_path)
                self.btn.SetLabelText('合并')
            else:
                self.txt.SetLabelText('合并开始...')
                self.pdf_merge()
                self.txt.SetLabelText('合并完成:' + os.path.join(self.folder_path, 'pdf_merge.pdf'))
                self.btn.SetLabelText('选择')

    def pdf_file_list(self):
        """
        获取文件夹中所有的.pdf类型的文件路径,包含子文件夹
        :return:
        """
        # 判断文件夹路径是否存在
        assert os.path.exists(self.folder_path), 'The folder path does not exist'
        pdf_paths = list()
        for root, dirs, files in os.walk(self.folder_path):
            for file in files:
                if file.endswith('.pdf'):
                    pdf_paths.append(os.path.join(root, file))
        return pdf_paths

    def pdf_merge(self, merge_name='pdf_merge.pdf'):
        """

        :param merge_name: 合并后的文件名
        :return:
        """
        print('PDF合并开始...')
        pdf_lst = self.pdf_file_list()
        file_merger = PdfFileMerger()
        for pdf in pdf_lst:
            # 合并pdf文件
            file_merger.append(pdf)

        # 合并后的文件导出
        file_merger.write(os.path.join(self.folder_path, merge_name))
        print('PDF合并完成')


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


if __name__ == '__main__':
    app = App()
    app.MainLoop()

5.合并工具下载

        PDF合并工具

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现PDF合并工具(含源码) 的相关文章

随机推荐

  • RC-u4 相对论大师(bfs求解指定路径)

    PTA 程序设计类实验辅助教学平台 题解 bfs可以求解从根节点到叶子节点的指定路径 这里的vis 不是为了防止访问到父节点 更多的是为了缩小路径长度 mpp和mp的映射也很巧妙 开始我用的还是map
  • [从零开始学习FPGA编程-38]:进阶篇 -语法-函数与任务

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 什么是函数Function 1 1 什么是函数 1 2 函
  • 【JAVA】输入:Scaner

    一 语法 1 导入 import java util Scanner 2 创建对象 Scanner scanner new Scanner System in 3 创建变量 int x scanner nextInt next系列 next
  • 服务器运维基础指南

    服务器运维基础指南 作为一个开发人员 对于服务器的操作不可避免 最常用的操作就是部署应用到服务器 及在生产 测试环境通过查看日志排查问题 一般服务器都是linux操作系统并且是无图形界面的 所以进行任何操作都是通过命令行 由于从新一代程序员
  • Android 中的AIDL 和 binder机制

    一 Binder 1 线程间通信Handler Handler和Binder是Android通信的两大支柱 Handler是线程间通信的基础 一个App的运行一定是多个线程相互协作的过程 特别是Android子线程不能更新UI界面的限制使得
  • 微信使用精准位置 wx.getLocation步骤

    微信小程序 gt 开发设置 gt 接口设置 gt 开通 wx getLocation 申请理由 应当前业务涉及周边服务推荐需要 需获取用户地理位置信息 调试基础库 2 24 4 在app json中添加 requiredPrivateInf
  • VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题...

    VC9编译的程序在没有装过VC9 确切的说是 Net Framework3 5 的机器上运行时 如果提示 由于应用程序配置不正确 应用程序未能启动 重新安装应用程序可能会纠正这个问题 这个错误 那么就说明该程序动态链接了VC9的运行时库 如
  • Java 实现 SCP 携带密码拷贝文件

    package com miracle luna scp import org apache sshd client SshClient import org apache sshd client session ClientSession
  • 线上阿里云短信盗刷问题实录

    背景 营销系统中有定时任务处理将待支付订单变更为已取消 执行时间五分钟一次 业务执行处理异常会发送短信给相关开发人员进行短信提醒 从下午一点二十五开始 开发人员间隔五分钟就会收到业务执行异常的短信提醒 最初因为测试或是正式环境中确实有异常的
  • 国产化系统下操作PDF

    本文围绕使用netcore 跨平台在国产系统 麒麟和统信 操作PDF 首先netcore 需要第三方dll 在Nuget里搜索itextsharp 选择图片中 安装即可 版本写了 itextsharp 是4 16 比较靠后 但是基本功能都有
  • Android反调试方法总结以及源码实现之检测篇(一)

    好久没有更新博客了 主要是忙项目的事 今日总结一下在Android中常遇到的反调试方法 一来帮助需要之人 二来加深自己的理解 反调试在代码保护中扮演着很重要的角色 虽然不能完全阻止攻击者 但是还是能加大攻击者的时间成本 一般与加壳结合使用
  • 手写SSH2服务器连接池

    初衷 在工作中遇到一个要与远程服务器建立连接并进行上传 下载的场景 所以在课余就试着写了一个ssh2服务器连接池的小demo 仅供参考 欢迎指正 目录概要 pom文件引入依赖
  • 内网信息收集(一)

    内网信息收集 收集本机信息 拿到一台服务器权限需要收集的信息 包括操作系统 IP 是否存在杀毒软件 打过的补丁等信息 查询网络配置信息 ipconfig all Linux下使用ifconfig 查询用户列表 net user 查看本机列表
  • 《重构的时机和方法》一本值得程序员都认真读的书

    写在前面 重构的时机和方法 是一本关于软件开发中重构技术的书籍 它以独特的风格和内容优势 为读者提供了全面而易于理解的指导 帮助他们在实际项目中应用重构技术 提高代码质量和开发效率 这本书由两个不同风格的部分组成 旨在满足不同读者群体的需求
  • 预训练模型与微调

    前言 预训练模型已经火了这么久了 但作为菜本菜的我却还在用lstm 在生成任务上与同门学长用的预训练模型相比 效果差的比较明显 所以 我决定走上预训练的不归路 以下分享我的学习过程 了解模型 小说故事生成模型 万事开头难 上视频 视频我喜欢
  • 汕头大学医学院物理与计算机教研室,药剂学教研室 - 汕头大学医学院 Shantou University Medical College...

    凌凯 男 中国医学科学院 北京协和医学院 清华大学医学部 生物医学工程 医学博士 副研究员 从事生物纳米检测新技术的研究与新型纳米肿瘤药物及疗法的研究 以第一作者和通讯作者发表SCI论文8篇 以项目负责人承担国家自然科学基金青年基金项目 广
  • spring过滤器、拦截器

    文章目录 一 二者对比 二 过滤器 过滤器的分类 过滤器的作用 过滤器的实现方式 三 拦截器 拦截器的实现方式 四 二者总结 一 二者对比 实现原理不同 过滤器是基于函数回调 拦截器是基于java的反射机制的 使用范围不同 过滤器依赖与se
  • 基于python图书馆管理系统和读者系统(附完整代码以及打包好的exe文件)

    摘要 本文基于python的图书馆管理系统和读者系统 实现了登录 注册 忘记密码 书籍查询 借阅 归还 修改等功能 通过csv文件将数据存储在本地 注册时采用了邮箱验证码 模拟了现实场景 全部源代码地址见文末 如果有其他奇思妙想或者bug欢
  • 【pytorch目标检测】创新之作:Fast R-CNN算法解读

    背景 2015年 提出了Fast RCNN算法 训练步骤实现端到端 CNN 基于VGG6 Fast R CNN是基于R CNN和SPPnets进行的改进 成果 训练速度比RCNN块9倍 测试速度快乐23倍 准确率68 4 SPPnets网络
  • Python实现PDF合并工具(含源码)

    在工作中 每个月都会要遇到报账的情况 在现如今很多都是使用电子发票 获得的电子发票很多都是PDF格式 偶尔也有图片格式的 而且还是一张发票一个pdf文档 在打印贴票时 就需要一个文档一个文档的打开打印 十分的不便捷 当然也可以使用某某PDF