鱼C论坛

 找回密码
 立即注册
查看: 3056|回复: 2

[技术交流] 用Python写了一个PDF合并的小工具

[复制链接]
发表于 2022-1-18 09:37:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# -*- coding: utf-8 -*-
# @Time : 2021-12-6 9:10
# @Author : Administrator
# @Email : lcmmljs@foxmail.com
# @File : main.py
# @Project : Project

import glob
import PySimpleGUI as sg
from PyPDF2 import PdfFileReader, PdfFileWriter

# 创建GUI布局
fra1 = sg.Frame('打开文件夹', [[sg.InputText(key='-IN-'), sg.FolderBrowse('文件位置')], [sg.Button('确认')]])
fra2 = sg.Frame('文件列表', [[sg.Listbox(values=[''], s=(54, 30), key='-LIST-')],
                         [sg.Button('上移'), sg.Button('下移'), sg.Button('合并')]])

col = sg.Column([[fra1], [fra2]], pad=(0, 0))

layout = [[col]]
window = sg.Window('合并PDF', layout, keep_on_top=True)

# 创建程序主循环
while True:
    event, value = window.read()
    if event is None:
        break
    elif event == '确认':
        if value['-IN-'] != '':
            path = window['-IN-'].get() + '/*.pdf'
            file = glob.glob(path)
            if file:
                window['-LIST-'].update(file)
            else:
                sg.popup_ok('文件夹内未识别到PDF文件~', title='错误', keep_on_top=True)
        else:
            sg.popup_ok('请选择文件夹~', title='错误', keep_on_top=True)
    elif event == '上移':
        if value['-LIST-']:
            choice = value['-LIST-']
            index = file.index(choice[0])
            file[index], file[index-1] = file[index-1], file[index]
            window['-LIST-'].update(file)
    elif event == '下移':
        if value['-LIST-']:
            choice = value['-LIST-']
            index = file.index(choice[0])
            file[index], file[index+1] = file[index+1], file[index]
            window['-LIST-'].update(file)
    elif event == '合并':
        if file:
            pdfFileWriter = PdfFileWriter()
            for pdf in file:
                pdfReader = PdfFileReader(open(pdf, 'rb'))
                numPages = pdfReader.getNumPages()
                for i in range(0, numPages):
                    pageObj = pdfReader.getPage(i)
                    pdfFileWriter.addPage(pageObj)
            folder = sg.popup_get_folder('请选择文件保存位置:', title='提示', keep_on_top=True)
            pdfFileWriter.write(open(folder + '//合并文件.pdf', 'wb'))
window.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-18 11:19:52 | 显示全部楼层
稍微更新一下~
# -*- coding: utf-8 -*-
# @Time : 2021-12-6 9:10
# @Author : Administrator
# @Email : lcmmljs@foxmail.com
# @File : main.py
# @Project : Project

import glob
import PySimpleGUI as sg
from PyPDF2 import PdfFileReader, PdfFileWriter

# 创建GUI布局
fra1 = sg.Frame('打开文件夹', [[sg.InputText(key='-IN-'), sg.FolderBrowse('文件位置')], [sg.Button('确认')]])
fra2 = sg.Frame('文件列表', [[sg.Listbox(values=[''], s=(54, 30), key='-LIST-')],
                         [sg.Button('上移'), sg.Button('下移'), sg.Button('移除'), sg.Button('合并')]])

col = sg.Column([[fra1], [fra2]], pad=(0, 0))

layout = [[col]]
window = sg.Window('合并PDF', layout, keep_on_top=True)

# 创建程序主循环
while True:
    event, value = window.read()
    if event is None:
        break
    elif event == '确认':
        if value['-IN-'] != '':
            path = window['-IN-'].get() + '/*.pdf'
            file = glob.glob(path)
            if file:
                filefloder = file[0].split('\\')[0] + '/'
                filename = [i.split('\\')[-1] for i in file]
                window['-LIST-'].update(filename)
            else:
                sg.popup_ok('文件夹内未识别到PDF文件~', title='错误', keep_on_top=True)
        else:
            sg.popup_ok('请选择文件夹~', title='错误', keep_on_top=True)
    elif event == '上移':
        try:
            choice = value['-LIST-']
            index = filename.index(choice[0])
            filename[index], filename[index-1] = filename[index-1], filename[index]
            window['-LIST-'].update(filename)
        except NameError:
            pass
    elif event == '下移':
        try:
            choice = value['-LIST-']
            index = filename.index(choice[0])
            filename[index], filename[index+1] = filename[index+1], filename[index]
            window['-LIST-'].update(filename)
        except NameError:
            pass
    elif event == '移除':
        try:
            choice = value['-LIST-'][0]
            filename.remove(choice)
            window['-LIST-'].update(filename)
        except NameError:
            pass
        except IndexError:
            pass
    elif event == '合并':
        try:
            if filename:
                file = [filefloder + i for i in filename]
                pdfFileWriter = PdfFileWriter()
                for pdf in file:
                    pdfReader = PdfFileReader(open(pdf, 'rb'))
                    numPages = pdfReader.getNumPages()
                    for i in range(0, numPages):
                        pageObj = pdfReader.getPage(i)
                        pdfFileWriter.addPage(pageObj)
                folder = sg.popup_get_folder('请选择文件保存位置:', title='提示', keep_on_top=True)
                pdfFileWriter.write(open(folder + '//合并文件.pdf', 'wb'))
                sg.popup_ok('文件已合并完成~', keep_on_top=True)
        except NameError:
            pass
window.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 19:26:49 | 显示全部楼层
本帖最后由 楪祈53409 于 2023-6-8 19:30 编辑

你好,我对你的代码进行了维护,修改了部分被废弃的函数.
我在py3.0上运行的,初次运行没安装库的先win+r分别运行
pip install PySimpleGUI 
pip install PyPDF2
安装所需的库.
以下是我维护好的代码:
import glob
import PySimpleGUI as sg
from PyPDF2 import PdfWriter, PdfReader

fra1 = sg.Frame('打开文件夹', [[sg.InputText(key='-IN-'), sg.FolderBrowse('文件位置')], [sg.Button('确认')]])
fra2 = sg.Frame('文件列表', [[sg.Listbox(values=[''], size=(54, 30), key='-LIST-')],
                         [sg.Button('上移'), sg.Button('下移'), sg.Button('移除'), sg.Button('合并')]])

col = sg.Column([[fra1], [fra2]], pad=(0, 0))

layout = [[col]]
window = sg.Window('合并PDF', layout, keep_on_top=True)

filename = []

while True:
    event, value = window.read()
    if event is None:
        break
    elif event == '确认':
        if value['-IN-'] != '':
            path = value['-IN-'] + '/*.pdf'
            file = glob.glob(path)
            if file:
                filefolder = file[0].split('\\')[0] + '/'
                filename = [i.split('\\')[-1] for i in file]
                window['-LIST-'].update(filename)
            else:
                sg.popup_ok('文件夹内未识别到PDF文件~', title='错误', keep_on_top=True)
        else:
            sg.popup_ok('请选择文件夹~', title='错误', keep_on_top=True)
    elif event == '上移':
        try:
            choice = value['-LIST-']
            index = filename.index(choice[0])
            filename[index], filename[index-1] = filename[index-1], filename[index]
            window['-LIST-'].update(filename)
        except NameError:
            pass
    elif event == '下移':
        try:
            choice = value['-LIST-']
            index = filename.index(choice[0])
            filename[index], filename[index+1] = filename[index+1], filename[index]
            window['-LIST-'].update(filename)
        except NameError:
            pass
        except IndexError:
            pass
    elif event == '移除':
        try:
            choice = value['-LIST-'][0]
            filename.remove(choice)
            window['-LIST-'].update(filename)
        except NameError:
            pass
        except IndexError:
            pass
    elif event == '合并':
        try:
            if filename:
                file = [filefolder + i for i in filename]
                pdfFileWriter = PdfWriter()
                for pdf in file:
                    pdfReader = PdfReader(open(pdf, 'rb'))
                    for page in pdfReader.pages:
                        pdfFileWriter.add_page(page)
                folder = sg.popup_get_folder('请选择文件保存位置:', title='提示', keep_on_top=True)
                with open(folder + '/合并文件.pdf', 'wb') as output_pdf:
                    pdfFileWriter.write(output_pdf)
                sg.popup_ok('文件已合并完成~', keep_on_top=True)
        except NameError:
            pass

window.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表