基于PyQt5制作一个PDF文件合并器

作者:Python?集中营 时间:2023-04-27 07:50:58 

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

基于PyQt5制作一个PDF文件合并器

将相关的三方模块导入到代码块中...

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)

这个变量主要是为了在子线程执行完成时向主线程传送变量值。这样,主线程就知道子线程的执行状态。

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文件中,直接启动即可运行。

来源:https://www.cnblogs.com/lwsbc/p/15957150.html

标签:Python,PyQt5,PDF,合并
0
投稿

猜你喜欢

  • MySQL8.0中的窗口函数的示例代码

    2024-01-14 12:30:26
  • Python完全新手教程

    2021-08-19 18:38:06
  • 基于Python编写一个刷题练习系统

    2022-10-01 13:28:34
  • 实现web打印的各种方法介绍及实现代码

    2024-04-18 09:40:31
  • python中的format是什么意思,format怎么用

    2022-07-31 08:51:45
  • Python 平方列表中每个数字的多种操作

    2023-11-14 03:53:00
  • mysql5.5与mysq 5.6中禁用innodb引擎的方法

    2024-01-21 13:55:42
  • Python基于execjs运行js过程解析

    2021-08-10 22:56:47
  • Python利用matplotlib做图中图及次坐标轴的实例

    2022-01-06 18:14:56
  • 利用Python批量生成任意尺寸的图片

    2021-02-14 11:20:12
  • Ubuntu 16.04/18.04 安装Pycharm及Ipython的教程

    2023-11-03 03:49:29
  • Python实现的朴素贝叶斯算法经典示例【测试可用】

    2021-09-10 19:15:25
  • 微信小程序实现点击出现弹窗

    2024-04-19 10:14:43
  • ChatGPT 中文调教指南总结

    2022-12-23 03:44:10
  • Mac上安装Mysql的详细步骤及配置

    2024-01-29 12:20:46
  • 使用c#构造date数据类型

    2024-01-15 22:19:15
  • 详解Python 关联规则分析

    2023-09-03 11:54:18
  • javascript实现删除前弹出确认框

    2024-04-18 09:28:54
  • python实现在控制台输入密码不显示的方法

    2023-06-19 22:44:23
  • Asp 日期格式化问题

    2011-03-31 10:47:00
  • asp之家 网络编程 m.aspxhome.com