办公自动化:PDF文件合并器,将多个PDF文件进行合并…

操作说明:选择多个PDF文件,执行完合并后会生成一个新的PDF文件,这个新的PDF文件包含所有源PDF文件的页面。

【阅读全文】

办公自动化:PDF文件合并器,将多个PDF文件进行合并...

将相关的三方模块导入代码块。

[En]

Import the relevant tripartite modules into the code block.

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import os
import PyPDF2  # PDF操作库

QThread是PyQt5的子线程应用,之前已经使用过比较多的次数了。一般使用时通过创建一个类专门处理线程相关的逻辑。注意在这个类上面继承 QThread,创建好之后里面的函数应用范式基本都是不会改变的。一个__ init__ 函数用来初始化、另一个 del 函数控制线程的销毁,还有一个run函数用来编写线程里面的业务逻辑。

这里面定义了一个信号量finished

finished = pyqtSignal(bool)

此变量的主要用途是当子线程完成执行时将变量的值传递给主线程。通过这种方式,主线程知道子线程的执行状态。

[En]

The main purpose of this variable is to pass the value of the variable to the main thread when the child thread finishes execution. In this way, the main thread knows the execution status of the child thread.

class WorkThread(QThread):
    finished = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(WorkThread, self).__init__(parent)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        pdf_files_path = self.parent.pdf_files_path.text().strip()
        pdf_tar_dir = self.parent.pdf_tar_dir.text().strip()

        file_list = pdf_files_path.split(',')

        merge = PyPDF2.PdfFileMerger()
        for file in file_list:
            merge.append(PyPDF2.PdfFileReader(file))
        merge.write(pdf_tar_dir + '/汇总.pdf')

        self.finished.emit(True)

编写UI界面,界面上的UI组件比较少,源文件按钮是为了选择需要合并的PDF文件(支持多选,选择文件时按住Ctrl键就可以选择多个文件)。目标路径是为了选择存储生成的后的合并文件的路径的。选择好之后点击开始按钮就可以调用子线程去执行PDF文件合并操作了。

class PDFMerge(QWidget):
    def __init__(self):
        super(PDFMerge, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('PDF文件合并器  公众号:[Python 集中营]')
        self.setWindowIcon(QIcon('pdf.ico'))
        self.setFixedWidth(500)
        self.setFixedHeight(120)

        grid = QGridLayout()

        self.pdf_files_path = QLineEdit()
        self.pdf_files_path.setReadOnly(True)

        self.pdf_files_btn = QPushButton()
        self.pdf_files_btn.setText('源文件')
        self.pdf_files_btn.clicked.connect(self.pdf_files_btn_click)

        self.pdf_tar_dir = QLineEdit()
        self.pdf_tar_dir.setReadOnly(True)

        self.pdf_tar_btn = QPushButton()
        self.pdf_tar_btn.setText('目标路径')
        self.pdf_tar_btn.clicked.connect(self.pdf_tar_btn_click)

        self.start_btn = QPushButton()
        self.start_btn.setText('开始合并吧')
        self.start_btn.clicked.connect(self.start_btn_click)

        grid.addWidget(self.pdf_files_path, 0, 0, 1, 1)
        grid.addWidget(self.pdf_files_btn, 0, 1, 1, 1)

        grid.addWidget(self.pdf_tar_dir, 1, 0, 1, 1)
        grid.addWidget(self.pdf_tar_btn, 1, 1, 1, 1)

        grid.addWidget(self.start_btn, 2, 0, 1, 2)

        self.thread_ = WorkThread(self)
        self.thread_.finished.connect(self.finished)

        self.setLayout(grid)

    def pdf_files_btn_click(self):
        files = QFileDialog.getOpenFileNames(self, os.getcwd(), '打开文件', 'PDF Files(*.pdf)')
        file_list = files[0]
        self.pdf_files_path.setText(','.join(file_list))

    def pdf_tar_btn_click(self):
        dir = QFileDialog.getExistingDirectory(self, os.getcwd(), '打开文件夹')
        self.pdf_tar_dir.setText(dir)

    def start_btn_click(self):
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def finished(self, finished):
        if finished is True:
            self.start_btn.setEnabled(True)

通过main函数启动应用…

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = PDFMerge()
    main.show()
    sys.exit(app.exec_())

将上述所有代码块copy到一个.py的python文件中,直接启动即可运行。

如果您有任何问题,请留言。博客写手必须把他们知道的一切都说出来,而且说个不停!

[En]

If you have any questions, please leave a message. Bloggers must say everything they know and say it endlessly!

办公自动化:PDF文件合并器,将多个PDF文件进行合并...

【往期精彩】

GUI猜数字游戏,直接开玩…

手把手教你做一个数据图表生成器(带源代码)。

[En]

Hand in hand to teach you to make a data chart generator (with source code).

动态指针时钟:利用pyqt5制作指针钟表显示实时时间

hashlib.md5()函数来筛选出系统重复文件并移除…

python 日志中最亮的仔,是喜欢的花里胡哨吖…

哈萨,英雄联盟的全皮肤下载器来了。

[En]

Hassa, here comes League of Legends’s full-skin downloader.

手绘图片生成器:以雪蓉为例,一键生成。

[En]

Hand-painted picture generator: take Xue Rong Rong as an example, one-click generation.

PyQt5的敏感词检测工具制作,运营者的福音…

最新发布的冬奥会吉祥物:冰墩,附源代码。

[En]

The newly released mascot of the Winter Olympic Games: ice pier, with source code.

最优美的表格查看插件:tabulate

手绘图片生成器:以雪蓉为例,一键生成。

[En]

Hand-painted picture generator: take Xue Rong Rong as an example, one-click generation.

大年初二、做了一个windows通知管理器!

Original: https://www.cnblogs.com/lwsbc/p/15957150.html
Author: Python集中营
Title: 办公自动化:PDF文件合并器,将多个PDF文件进行合并…

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/509894/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球