Python+PyQt5實(shí)現(xiàn)自制pdf工具箱
pdf工具,之前寫的合并工具有點(diǎn)麻煩,使用PyQt5庫(kù)重寫合并拆分和刪除指定頁(yè)面的程序
實(shí)現(xiàn)如圖:
代碼:
import sys import os from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog, QListWidget, QMessageBox, QLineEdit, QHBoxLayout, QInputDialog from PyQt5.QtCore import Qt, QThread, pyqtSignal from PyPDF2 import PdfReader, PdfWriter, PdfMerger from PyQt5 import QtGui class CustomListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) class Worker(QThread): finished = pyqtSignal(str) error = pyqtSignal(str) def __init__(self, pdf_files, range_str=None, save_path=None, operation=None): super().__init__() self.pdf_files = pdf_files self.range_str = range_str self.save_path = save_path self.operation = operation def run(self): try: if self.operation == 'merge': merger = PdfMerger() for pdf in self.pdf_files: merger.append(pdf) merger.write(self.save_path) merger.close() self.finished.emit('PDF文件已成功合并。') elif self.operation == 'split': start_page, end_page = self.parse_range(self.range_str) reader = PdfReader(self.pdf_files[zxsq-anti-bbcode-0]) os.makedirs(self.save_path, exist_ok=True) for page in range(start_page, end_page + 1): writer = PdfWriter() writer.add_page(reader.pages) split_save_path = os.path.join(self.save_path, f'Page_{page + 1}.pdf') writer.write(split_save_path) self.finished.emit('PDF文件已成功拆分并保存。') elif self.operation == 'delete': start_page, end_page = self.parse_range(self.range_str) reader = PdfReader(self.pdf_files[zxsq-anti-bbcode-0]) writer = PdfWriter() for page_num in range(len(reader.pages)): if not (start_page <= page_num <= end_page): writer.add_page(reader.pages[zxsq-anti-bbcode-page_num]) writer.write(self.save_path) self.finished.emit('指定頁(yè)面已從PDF中刪除。') except Exception as e: self.error.emit(str(e)) def parse_range(self, range_str): if '-' in range_str: start_page, end_page = map(int, range_str.split('-')) else: start_page = end_page = int(range_str) return start_page - 1, end_page - 1 # Convert to 0-based index class PDFMergerApp(QMainWindow): def __init__(self): super().__init__() self.initUI() self.pdf_files = [] def initUI(self): self.setWindowTitle('PDF 工具箱') self.setWindowIcon(QtGui.QIcon('111.ico')) self.setGeometry(100, 100, 800, 600) mainLayout = QVBoxLayout() self.addButton = QPushButton('添加 PDF', self) self.addButton.clicked.connect(self.addPDF) mainLayout.addWidget(self.addButton) self.listWidget = CustomListWidget(self) mainLayout.addWidget(self.listWidget) # 刪除按鈕的水平布局 deleteLayout = QHBoxLayout() self.removeButton = QPushButton('刪除選定', self) self.removeButton.clicked.connect(self.removeSelected) deleteLayout.addWidget(self.removeButton) self.removeAllButton = QPushButton('刪除全部', self) self.removeAllButton.clicked.connect(self.removeAll) deleteLayout.addWidget(self.removeAllButton) mainLayout.addLayout(deleteLayout) self.mergeButton = QPushButton('合并 PDFs', self) self.mergeButton.clicked.connect(self.mergePDFs) mainLayout.addWidget(self.mergeButton) # 拆分和刪除頁(yè)碼的水平布局 splitDeleteLayout = QHBoxLayout() self.splitInput = QLineEdit(self) self.splitInput.setPlaceholderText('輸入拆分范圍,如 1 或 1-4') splitDeleteLayout.addWidget(self.splitInput) self.splitButton = QPushButton('拆分 PDF', self) self.splitButton.clicked.connect(self.splitPDF) splitDeleteLayout.addWidget(self.splitButton) self.deleteInput = QLineEdit(self) self.deleteInput.setPlaceholderText('輸入刪除頁(yè)碼,如 1 或 1-4') splitDeleteLayout.addWidget(self.deleteInput) self.deleteButton = QPushButton('刪除頁(yè)面', self) self.deleteButton.clicked.connect(self.deletePages) splitDeleteLayout.addWidget(self.deleteButton) mainLayout.addLayout(splitDeleteLayout) container = QWidget() container.setLayout(mainLayout) self.setCentralWidget(container) def addPDF(self): files, _ = QFileDialog.getOpenFileNames(self, '打開文件', '', 'PDF files (*.pdf)') for file_path in files: self.addPDFFile(file_path) def addPDFFile(self, file_path): if file_path and file_path not in self.pdf_files: self.pdf_files.append(file_path) self.listWidget.addItem(file_path) def removeSelected(self): for item in self.listWidget.selectedItems(): self.pdf_files.remove(item.text()) self.listWidget.takeItem(self.listWidget.row(item)) def removeAll(self): self.pdf_files.clear() self.listWidget.clear() def mergePDFs(self): save_path, _ = QFileDialog.getSaveFileName(self, '保存文件', '', 'PDF files (*.pdf)') if save_path: self.thread = Worker(self.pdf_files, save_path=save_path, operation='merge') self.thread.finished.connect(self.onFinished) self.thread.error.connect(self.onError) self.thread.start() def splitPDF(self): if len(self.pdf_files) != 1: QMessageBox.warning(self, "錯(cuò)誤", "請(qǐng)只選擇一個(gè)PDF文件進(jìn)行拆分。") return range_str = self.splitInput.text().strip() folder_path = self.getFolderName() if range_str and folder_path: self.thread = Worker(self.pdf_files, range_str=range_str, save_path=folder_path, operation='split') self.thread.finished.connect(self.onFinished) self.thread.error.connect(self.onError) self.thread.start() def getFolderName(self): folder_path = QFileDialog.getExistingDirectory(self, "選擇保存拆分文件的位置") if folder_path: folder_name, ok = QInputDialog.getText(self, "文件夾名稱", "輸入文件夾名稱:") if ok and folder_name: full_path = os.path.join(folder_path, folder_name) os.makedirs(full_path, exist_ok=True) return full_path return None def deletePages(self): if len(self.pdf_files) != 1: QMessageBox.warning(self, "錯(cuò)誤", "請(qǐng)只選擇一個(gè)PDF文件進(jìn)行刪除操作。") return range_str = self.deleteInput.text().strip() save_path = QFileDialog.getSaveFileName(self, '保存文件', '', 'PDF files (*.pdf)')[zxsq-anti-bbcode-0] if save_path and range_str: self.thread = Worker(self.pdf_files, range_str=range_str, save_path=save_path, operation='delete') self.thread.finished.connect(self.onFinished) self.thread.error.connect(self.onError) self.thread.start() def onFinished(self, message): self.show_message("操作完成", message) self.clear_pdf_list() def onError(self, error_message): self.show_message("操作失敗", error_message) def show_message(self, title, message): QMessageBox.information(self, title, message) def clear_pdf_list(self): self.pdf_files.clear() self.listWidget.clear() def main(): app = QApplication(sys.argv) ex = PDFMergerApp() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()
到此這篇關(guān)于Python+PyQt5實(shí)現(xiàn)自制pdf工具箱的文章就介紹到這了,更多相關(guān)Python pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中的chr()函數(shù)與ord()函數(shù)解析
這篇文章主要介紹了Python中的chr()函數(shù)與ord()函數(shù)解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05PyQt5實(shí)現(xiàn)讓QScrollArea支持鼠標(biāo)拖動(dòng)的操作方法
今天小編就為大家分享一篇PyQt5實(shí)現(xiàn)讓QScrollArea支持鼠標(biāo)拖動(dòng)的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python?代替?xftp?從?Linux?服務(wù)器下載文件的操作方法
我們經(jīng)常需要從Linux服務(wù)器上同步文件,但是xftp等工具都需要注冊(cè)了,這里用免費(fèi)的Python代碼來下載文件,還可以擴(kuò)展更多的自定義用法,這篇文章主要介紹了Python?代替?xftp?從?Linux?服務(wù)器下載文件,需要的朋友可以參考下2024-06-06python中合并兩個(gè)文本文件并按照姓名首字母排序的例子
這篇文章主要介紹了python中合并兩個(gè)文本文件并按照姓名首字母排序的例子,需要的朋友可以參考下2014-04-04python實(shí)現(xiàn)堆排序的實(shí)例講解
在本篇文章里小編給大家分享的是一篇關(guān)于python實(shí)現(xiàn)堆排序的實(shí)例講解內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-02-02pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作
這篇文章主要介紹了pandas快速處理Excel,替換Nan,轉(zhuǎn)字典的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03python的三目運(yùn)算符和not in運(yùn)算符使用示例
這篇文章主要介紹了python的三目運(yùn)算符和not in運(yùn)算符使用示例,需要的朋友可以參考下2014-03-03