pdf tool, previously written merger tool is a bit of a problem, the use of PyQt5 library to rewrite the merger split and delete the specified page of the program
The realization is shown in the figure:
Code:
import sys import os from import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog, QListWidget, QMessageBox, QLineEdit, QHBoxLayout, QInputDialog from 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 = operation def run(self): try: if == 'merge': merger = PdfMerger() for pdf in self.pdf_files: (pdf) (self.save_path) () ('The PDF files have been successfully merged.') elif == 'split': start_page, end_page = self.parse_range(self.range_str) reader = PdfReader(self.pdf_files[zxsq-anti-bbcode-0]) (self.save_path, exist_ok=True) for page in range(start_page, end_page + 1): writer = PdfWriter() writer.add_page() split_save_path = (self.save_path, f'Page_{page + 1}.pdf') (split_save_path) ('The PDF file has been successfully split and saved.') elif == '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()): if not (start_page <= page_num <= end_page): writer.add_page([zxsq-anti-bbcode-page_num]) (self.save_path) ('The specified page has been removed from the PDF.') except Exception as e: (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.pdf_files = [] def initUI(self): ('PDF Toolbox') (('')) (100, 100, 800, 600) mainLayout = QVBoxLayout() = QPushButton('Add PDF', self) () () = CustomListWidget(self) () # Delete button horizontal layout deleteLayout = QHBoxLayout() = QPushButton('Delete selected', self) () () = QPushButton('Delete All', self) () () (deleteLayout) = QPushButton('Merge PDFs', self) () () # Horizontal layout for splitting and deleting page numbers splitDeleteLayout = QHBoxLayout() = QLineEdit(self) ('Enter the split range, e.g. 1 or 1-4') () = QPushButton('Split PDF', self) () () = QLineEdit(self) ('Enter the deleted page number, e.g. 1 or 1-4') () = QPushButton('Delete page', self) () () (splitDeleteLayout) container = QWidget() (mainLayout) (container) def addPDF(self): files, _ = (self, 'Open file', '', 'PDF files (*.pdf)') for file_path in files: (file_path) def addPDFFile(self, file_path): if file_path and file_path not in self.pdf_files: self.pdf_files.append(file_path) (file_path) def removeSelected(self): for item in (): self.pdf_files.remove(()) ((item)) def removeAll(self): self.pdf_files.clear() () def mergePDFs(self): save_path, _ = (self, 'Save file', '', 'PDF files (*.pdf)') if save_path: = Worker(self.pdf_files, save_path=save_path, operation='merge') () () () def splitPDF(self): if len(self.pdf_files) != 1: (self, "Error.", "Please select only one PDF file to split.") return range_str = ().strip() folder_path = () if range_str and folder_path: = Worker(self.pdf_files, range_str=range_str, save_path=folder_path, operation='split') () () () def getFolderName(self): folder_path = (self, "Choose where to save the split file") if folder_path: folder_name, ok = (self, "Folder name", "Enter folder name:") if ok and folder_name: full_path = (folder_path, folder_name) (full_path, exist_ok=True) return full_path return None def deletePages(self): if len(self.pdf_files) != 1: (self, "Error.", "Please select only one PDF file for deletion operation.") return range_str = ().strip() save_path = (self, 'Save file', '', 'PDF files (*.pdf)')[zxsq-anti-bbcode-0] if save_path and range_str: = Worker(self.pdf_files, range_str=range_str, save_path=save_path, operation='delete') () () () def onFinished(self, message): self.show_message("Operation complete.", message) self.clear_pdf_list() def onError(self, error_message): self.show_message("Operation failed.", error_message) def show_message(self, title, message): (self, title, message) def clear_pdf_list(self): self.pdf_files.clear() () def main(): app = QApplication() ex = PDFMergerApp() () (app.exec_()) if __name__ == '__main__': main()
to this article on Python + PyQt5 to achieve the homemade pdf toolbox is introduced to this article, more related Python pdf content please search my previous posts or continue to browse the following articles hope that you will support me in the future!