最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+PyQt5實現(xiàn)自制pdf工具箱

 更新時間:2023年12月11日 08:38:54   作者:mYlEaVeiSmVp  
這篇文章主要為大家詳細介紹了Python如何利用PyQt5自制pdf工具箱,可以實現(xiàn)合并拆分和刪除指定pdf頁面,感興趣的小伙伴可以跟隨小編一起學習一下

pdf工具,之前寫的合并工具有點麻煩,使用PyQt5庫重寫合并拆分和刪除指定頁面的程序

實現(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('指定頁面已從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)
        # 拆分和刪除頁碼的水平布局
        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('輸入刪除頁碼,如 1 或 1-4')
        splitDeleteLayout.addWidget(self.deleteInput)
        self.deleteButton = QPushButton('刪除頁面', 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, "錯誤", "請只選擇一個PDF文件進行拆分。")
            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, "錯誤", "請只選擇一個PDF文件進行刪除操作。")
            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()

到此這篇關于Python+PyQt5實現(xiàn)自制pdf工具箱的文章就介紹到這了,更多相關Python pdf內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

兴城市| 鹰潭市| 远安县| 朝阳市| 通州区| 福贡县| 文山县| 广东省| 五大连池市| 若尔盖县| 泊头市| 德保县| 湟源县| 新余市| 商河县| 商南县| 门头沟区| 扎兰屯市| 远安县| 宝山区| 巴楚县| 多伦县| 探索| 新沂市| 革吉县| 武隆县| 弋阳县| 磴口县| 青岛市| 澎湖县| 同心县| 资溪县| 穆棱市| 宜兴市| 肃北| 囊谦县| 大冶市| 韶关市| 安庆市| 满洲里市| 宜都市|