基于PyQt5制作一個(gè)PDF文件合并器
操作說(shuō)明:選擇多個(gè)PDF文件,執(zhí)行完合并后會(huì)生成一個(gè)新的PDF文件,這個(gè)新的PDF文件包含所有源PDF文件的頁(yè)面。
將相關(guān)的三方模塊導(dǎo)入到代碼塊中...
from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import sys import os import PyPDF2 # PDF操作庫(kù)
QThread是PyQt5的子線程應(yīng)用,之前已經(jīng)使用過(guò)比較多的次數(shù)了。一般使用時(shí)通過(guò)創(chuàng)建一個(gè)類(lèi)專(zhuān)門(mén)處理線程相關(guān)的邏輯。注意在這個(gè)類(lèi)上面繼承 QThread,創(chuàng)建好之后里面的函數(shù)應(yīng)用范式基本都是不會(huì)改變的。一個(gè)__ init__ 函數(shù)用來(lái)初始化、另一個(gè) del 函數(shù)控制線程的銷(xiāo)毀,還有一個(gè)run函數(shù)用來(lái)編寫(xiě)線程里面的業(yè)務(wù)邏輯。
這里面定義了一個(gè)信號(hào)量finished
finished = pyqtSignal(bool)
這個(gè)變量主要是為了在子線程執(zhí)行完成時(shí)向主線程傳送變量值。這樣,主線程就知道子線程的執(zhí)行狀態(tài)。
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)
編寫(xiě)UI界面,界面上的UI組件比較少,源文件按鈕是為了選擇需要合并的PDF文件(支持多選,選擇文件時(shí)按住Ctrl鍵就可以選擇多個(gè)文件)。目標(biāo)路徑是為了選擇存儲(chǔ)生成的后的合并文件的路徑的。選擇好之后點(diǎn)擊開(kāi)始按鈕就可以調(diào)用子線程去執(zhí)行PDF文件合并操作了。
class PDFMerge(QWidget): def __init__(self): super(PDFMerge, self).__init__() self.init_ui() def init_ui(self): self.setWindowTitle('PDF文件合并器 公眾號(hào):[Python 集中營(yíng)]') 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('目標(biāo)路徑') self.pdf_tar_btn.clicked.connect(self.pdf_tar_btn_click) self.start_btn = QPushButton() self.start_btn.setText('開(kāi)始合并吧') 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(), '打開(kāi)文件', '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(), '打開(kāi)文件夾') 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)
通過(guò)main函數(shù)啟動(dòng)應(yīng)用...
if __name__ == '__main__': app = QApplication(sys.argv) main = PDFMerge() main.show() sys.exit(app.exec_())
將上述所有代碼塊copy到一個(gè).py的python文件中,直接啟動(dòng)即可運(yùn)行。
到此這篇關(guān)于基于PyQt5制作一個(gè)PDF文件合并器的文章就介紹到這了,更多相關(guān)PyQt5 PDF文件合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python網(wǎng)絡(luò)爬蟲(chóng)之獲取網(wǎng)絡(luò)數(shù)據(jù)
本文介紹了Python中用于獲取網(wǎng)絡(luò)數(shù)據(jù)的重要工具之一——Requests庫(kù),詳細(xì)講解了Requests庫(kù)的基本使用方法、請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求參數(shù)、Cookies、Session等內(nèi)容,并結(jié)合實(shí)例代碼展示了Requests庫(kù)的應(yīng)用場(chǎng)景2023-04-04python getpass實(shí)現(xiàn)密文實(shí)例詳解
這篇文章主要介紹了python getpass實(shí)現(xiàn)密文實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Windows8下安裝Python的BeautifulSoup
這篇文章主要介紹了Windows8下安裝Python的BeautifulSoup,本文著重講解安裝中出現(xiàn)的錯(cuò)誤和解決方法,需要的朋友可以參考下2015-01-01Pycharm沒(méi)有報(bào)錯(cuò)提示(誤觸ignore)的完美解決方案
這篇文章主要介紹了Pycharm沒(méi)有報(bào)錯(cuò)提示(誤觸ignore)的解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12pycharm打開(kāi)長(zhǎng)代碼文件CPU占用率過(guò)高的解決
這篇文章主要介紹了pycharm打開(kāi)長(zhǎng)代碼文件CPU占用率過(guò)高的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09如何用tempfile庫(kù)創(chuàng)建python進(jìn)程中的臨時(shí)文件
這篇文章主要介紹了如何用tempfile庫(kù)創(chuàng)建python進(jìn)程中的臨時(shí)文件,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01粗暴解決CUDA out of memory的問(wèn)題
這篇文章主要介紹了粗暴解決CUDA out of memory的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05