编程学习网 > 编程语言 > Python > python轻松实现PDF解密,含GUI及打包技巧
2024
07-10

python轻松实现PDF解密,含GUI及打包技巧


在日常工作中,我们经常会遇到一些被加密的PDF文件。为了能够顺利地阅读或编辑这些文件,我们需要先破解其密码。本文将介绍如何开发一个带有图形用户界面(GUI)的PDF解密工具,可以方便地选择文件并解密PDF文档。


工具选择与环境准备
开发PDF解密工具所需的环境包括Python编程语言及其一些库:

PyPDF2:用于读取和写入PDF文件。
PyQt5:用于创建图形用户界面。
PyInstaller:用于将Python脚本打包成可执行文件。首先,确保你已安装所需的库,可以使用以下命令进行安装:
pip install PyPDF2 PyQt5 pyinstaller
GUI界面的设计与实现
我们的工具需要一个简单的用户界面,使用户能够选择加密的PDF文件、选择解密后的保存路径,并显示解密进度。我们使用PyQt5来实现这个界面。

初始化界面
首先,我们创建一个PDFDecryptor类,继承自QWidget,并在其中初始化界面元素。

import sys
from PyPDF2 import PdfReader, PdfWriter
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QFileDialog, QTextEdit, QLabel

class PDFDecryptor(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):
        self.setWindowTitle('PDF解密工具')
        self.setGeometry(100, 100, 600, 400)
        
        layout = QVBoxLayout()
        
        self.file_label = QLabel('选择加密的PDF文件:')
        layout.addWidget(self.file_label)
        
        self.file_button = QPushButton('选择文件')
        self.file_button.clicked.connect(self.select_file)
        layout.addWidget(self.file_button)
        
        self.output_label = QLabel('选择解密后的PDF文件保存路径:')
        layout.addWidget(self.output_label)
        
        self.output_button = QPushButton('选择路径')
        self.output_button.clicked.connect(self.select_output_path)
        layout.addWidget(self.output_button)
        
        self.decrypt_button = QPushButton('开始解密')
        self.decrypt_button.clicked.connect(self.decrypt_pdf)
        layout.addWidget(self.decrypt_button)
        
        self.log = QTextEdit()
        self.log.setReadOnly(True)
        layout.addWidget(self.log)
        
        self.setLayout(layout)
文件选择与路径选择
接下来,我们实现文件选择和路径选择功能。这两个功能通过点击按钮来触发,并在日志区域显示用户的选择。

def select_file(self):
    options = QFileDialog.Options()
    file_path, _ = QFileDialog.getOpenFileName(self, "选择加密的PDF文件", "", "PDF Files (*.pdf)", options=options)
    if file_path:
        self.file_path = file_path
        self.log.append(f'选择的文件: {file_path}')

def select_output_path(self):
    options = QFileDialog.Options()
    folder_path = QFileDialog.getExistingDirectory(self, "选择解密后的PDF文件保存路径", options=options)
    if folder_path:
        self.output_path = folder_path
        self.log.append(f'保存路径: {folder_path}')
解密功能的实现
在用户选择文件和保存路径后,点击“开始解密”按钮即可触发解密操作。我们通过调用load_pdf方法来读取并解密PDF文件,然后使用PdfWriter将解密后的内容写入新的PDF文件。

def decrypt_pdf(self):
    if hasattr(self, 'file_path'):
        input_path = self.file_path
        
        if not hasattr(self, 'output_path'):
            output_path = "".join(input_path.split('.')[:-1]) + '_decrypted.pdf'
        else:
            output_path = f"{self.output_path}/{input_path.split('/')[-1].split('.')[0]}_decrypted.pdf"
        
        self.log.append('正在解密...')
        pdf_reader = self.load_pdf(input_path)
        if pdf_reader is None:
            self.log.append("未能读取内容")
        elif not pdf_reader.is_encrypted:
            self.log.append('文件未加密,无需操作')
        else:
            pdf_writer = PdfWriter()
            pdf_writer.append_pages_from_reader(pdf_reader)
            
            with open(output_path, 'wb') as output_file:
                pdf_writer.write(output_file)
            self.log.append(f"解密文件已生成: {output_path}")
    else:
        self.log.append("请先选择PDF文件")

def load_pdf(self, file_path):
    try:
        pdf_file = open(file_path, 'rb')
    except Exception as error:
        self.log.append('无法打开文件: ' + str(error))
        return None

    reader = PdfReader(pdf_file, strict=False)

    if reader.is_encrypted:
        try:
            reader.decrypt('')
        except Exception as error:
            self.log.append('无法解密文件: ' + str(error))
            return None
    return reader
运行主程序
最后,我们在主程序中运行我们的PDF解密工具。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = PDFDecryptor()
    ex.show()
    sys.exit(app.exec_())
打包成可执行文件
为了方便用户使用,我们可以将该Python脚本打包成一个可执行文件。使用PyInstaller可以轻松实现这一点:

pyinstaller --onefile --windowed pdf解密.py
将pdf解密.py替换为你的脚本文件名。运行上述命令后,将在dist文件夹中生成一个可执行文件,可以直接运行它来使用我们的PDF解密工具。

完整代码分享
import sys
from PyPDF2 import PdfReader, PdfWriter
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QFileDialog, QTextEdit, QLabel

class PDFDecryptor(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):
        self.setWindowTitle('PDF解密工具')
        self.setGeometry(100, 100, 600, 400)
        
        layout = QVBoxLayout()
        
        self.file_label = QLabel('选择加密的PDF文件:')
        layout.addWidget(self.file_label)
        
        self.file_button = QPushButton('选择文件')
        self.file_button.clicked.connect(self.select_file)
        layout.addWidget(self.file_button)
        
        self.output_label = QLabel('选择解密后的PDF文件保存路径:')
        layout.addWidget(self.output_label)
        
        self.output_button = QPushButton('选择路径')
        self.output_button.clicked.connect(self.select_output_path)
        layout.addWidget(self.output_button)
        
        self.decrypt_button = QPushButton('开始解密')
        self.decrypt_button.clicked.connect(self.decrypt_pdf)
        layout.addWidget(self.decrypt_button)
        
        self.log = QTextEdit()
        self.log.setReadOnly(True)
        layout.addWidget(self.log)
        
        self.setLayout(layout)

    def select_file(self):
        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getOpenFileName(self, "选择加密的PDF文件", "", "PDF Files (*.pdf)", options=options)
        if file_path:
            self.file_path = file_path
            self.log.append(f'选择的文件: {file_path}')

    def select_output_path(self):
        options = QFileDialog.Options()
        folder_path = QFileDialog.getExistingDirectory(self, "选择解密后的PDF文件保存路径", options=options)
        if folder_path:
            self.output_path = folder_path
            self.log.append(f'保存路径: {folder_path}')

    def decrypt_pdf(self):
        if hasattr(self, 'file_path'):
            input_path = self.file_path
            
            if not hasattr(self, 'output_path'):
                output_path = "".join(input_path.split('.')[:-1]) + '_decrypted.pdf'
            else:
                output_path = f"{self.output_path}/{input_path.split('/')[-1].split('.')[0]}_decrypted.pdf"
            
            self.log.append('正在解密...')
            pdf_reader = self.load_pdf(input_path)
            if pdf_reader is None:
                self.log.append("未能读取内容")
            elif not pdf_reader.is_encrypted:
                self.log.append('文件未加密,无需操作')
            else:
                pdf_writer = PdfWriter()
                pdf_writer.append_pages_from_reader(pdf_reader)
                
                with open(output_path, 'wb') as output_file:
                    pdf_writer.write(output_file)
                self.log.append(f"解密文件已生成: {output_path}")
        else:
            self.log.append("请先选择PDF文件")
    
    def load_pdf(self, file_path):
        try:
            pdf_file = open(file_path, 'rb')
        except Exception as error:
            self.log.append('无法打开文件: ' + str(error))
            return None

        reader = PdfReader(pdf_file, strict=False)

        if reader.is_encrypted:
            try:
                reader.decrypt('')
            except Exception as error:
                self.log.append('无法解密文件: ' + str(error))
                return None
        return reader

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = PDFDecryptor()
    ex.show()

    sys.exit(app.exec_())

以上就是python轻松实现PDF解密,含GUI及打包技巧的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取