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

在工作中,每个月都会要遇到报账的情况,在现如今很多都是使用电子发票,获得的电子发票很多都是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合并工具

你可能感兴趣的:(python,python)