Python-PDF文件密码破解小工具

背景

经常从网络上下载的PDF笔记被加了密,在自己学习的过程中想要添加书签却因为没有密码无法添加,所以通过Python实现一个解密小工具,亲测大多数密码都可以破解。

代码

python 复制代码
import os
import tkinter as tk
from tkinter import filedialog
#pdf的读取方法
from PyPDF2 import PdfReader
#pdf的写入方法
from PyPDF2 import PdfWriter
#高加密的方法,要引入不然会报错
from Crypto.Cipher import AES
# 该脚本使用Python3

def select_input_file(root, input_file_path_var):
    input_file_path = filedialog.askopenfilename(filetypes=[("PDF files", "*.PDF;*.pdf")])
    if input_file_path:
        input_file_path_var.delete(0, tk.END)
        input_file_path_var.insert(0, input_file_path)
    return input_file_path


# 定义一个函数来读取PDF文件
def get_reader(filename, password):
    try:
        old_file = open(filename, 'rb')
        print('解密开始...')
    except Exception as err:
        return print('文件打开失败!' + str(err))

    #如果使用python2需要将PdfReader改为PdfFileReader
    pdf_reader = PdfReader(old_file, strict=False)

    # 如果使用python2需要将is_encrypted改为isEncrypted
    # 执行解密操作
    if pdf_reader.is_encrypted:
        if password is None:
            return print('文件被加密,需要密码!--{}'.format(filename))
        else:
            if pdf_reader.decrypt(password) != 1:
                return print('密码不正确!--{}'.format(filename))
    elif old_file in locals():
        old_file.close()
        # 返回结果
    return pdf_reader

def deception_pdf(root,filename, password, decrypted_filename=None):
    print('正在生成解密...')
    pdf_reader = get_reader(filename, password)
    if pdf_reader is None:
        return print("无内容读取")

    # 如果使用python2需要将is_encrypted改为isEncrypted
    elif not pdf_reader.is_encrypted:
        return print('文件没有被加密,无需操作')

    # 如果使用的是python2需要将PdfWriter改为PdfFileWriter
    pdf_writer = PdfWriter()

    #如果使用的是python2需要将将append_pages_from_reader改为appendPagesFromReader
    pdf_writer.append_pages_from_reader(pdf_reader)
    #创建解密后的pdf文件和展示文件的路径
    if decrypted_filename is None:
        decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + '已解密' + '.pdf'
        print("解密文件已生成:{}".format(decrypted_filename))
    # 写入新文件
    pdf_writer.write(open(decrypted_filename, 'wb'))
    root.destroy()

# 创建主函数
def main():
    # 创建主窗口
    root = tk.Tk()
    root.title("PDF解密小工具")
    # 创建一个Tkinter变量来存储文件路径
    input_file_path_var = tk.StringVar()
    # 输入文件框
    input_frame = tk.Frame(root)
    input_frame.pack(pady=10)
    input_label = tk.Label(input_frame, text="输入文件:")
    input_label.pack(side=tk.LEFT)
    input_file_path_var = tk.Entry(input_frame, width=50)
    input_file_path_var.pack(side=tk.LEFT)
    input_button = tk.Button(input_frame, text="选择文件", command=lambda:select_input_file(root,input_file_path_var))
    input_button.pack(side=tk.LEFT)

    # 创建按钮用于执行脚本
    execute_button = tk.Button(root, text="执行脚本", command=lambda:deception_pdf(root,input_file_path_var.get(), ''))
    execute_button.pack(pady=5)

    # 运行Tkinter事件循环
    root.mainloop()

if __name__ == "__main__":
    main()
相关推荐
yannan20190313几秒前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁10 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev12 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
王俊山IT12 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。14 分钟前
c++多线程
java·开发语言
小政爱学习!16 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
好喜欢吃红柚子26 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python30 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
k093331 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯39 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长