用 Python 批量删除 PDF 文件的密码

起因是最近在网上收集了一些 PDF 资料,但是分享资源的人给每个 PDF 文件都加了密码,这就很麻烦了,每次查看都要输入密码,如果手动去除密码又需要耗费一些时间,幸好 Python 中有个 PyPDF2 库,用它可以很方便的去除PDF中的密码,最终在GPT的帮助下我写出了一个批量去除的脚本。

我打包成了可执行文件,如果要使用成品可以直接下载使用:https://moek.lanzouq.com/b03rm55be?password=pdf

如果想从源码运行可以接着往下看:

在使用前需要安装 PyPDF2 库。

pip install PyPDF2

如果出现报错,则是因为 PyPDF2 需要 PyCryptodome 库来处理AES算法,需要安装 PyCryptodome 库

pip install pycryptodome

保存下面代码为 py 文件(也可以点此下载),执行后根据提示输入路径和密码就OK了。如果目录的pdf文件没有密码会自动跳过。


import os
from PyPDF2 import PdfReader, PdfWriter
from colorama import init, Fore

init()

def remove_password(input_file, output_file, password):
    print(Fore.CYAN + "正在删除密码:", input_file)
    with open(input_file, "rb") as f:
        pdf_reader = PdfReader(f)
        if pdf_reader.is_encrypted:
            try:
                pdf_reader.decrypt(password)
                print(Fore.GREEN + "密码删除成功.")
            except Exception as e:
                print(Fore.RED + f"Error removing password: {e}")
                return
        else:
            print(Fore.YELLOW + "文件未加密,跳过...")

        # 将解密的内容写入新的pdf文件
        pdf_writer = PdfWriter()
        for page_num in range(len(pdf_reader.pages)):
            pdf_writer.add_page(pdf_reader.pages[page_num])

        # 如果输出目录不存在则创建目录
        os.makedirs(os.path.dirname(output_file), exist_ok=True)

        with open(output_file, "wb") as out_f:
            pdf_writer.write(out_f)

        print(Fore.CYAN + "已解密的PDF文件已保存到:", output_file ,"\n")

if __name__ == "__main__":
    input_directory = input("输入包含加密PDF文件的目录: ")
    output_directory = input("输入保存解密后的 PDF 文件的目录: ")
    password = input("输入解密 PDF 文件的密码: ")

    if not os.path.isdir(input_directory):
        print(Fore.RED + f"Error: Input directory '{input_directory}' not found.")
        exit(1)

    for root, dirs, files in os.walk(input_directory):
        for file in files:
            if file.endswith(".pdf"):
                input_file = os.path.join(root, file)
                relative_path = os.path.relpath(input_file, input_directory)
                output_file = os.path.join(output_directory, relative_path)
                remove_password(input_file, output_file, password)

上面是批量解密的,顺便再写个批量加密的,保存下面代码为py文件执行即可(也可以点此下载)。

import os
from PyPDF2 import PdfReader, PdfWriter
from colorama import init, Fore

init()

def encrypt_pdf(input_file, output_file, password):
    print(Fore.CYAN + "正在加密文件:", input_file)
    with open(input_file, "rb") as f:
        pdf_reader = PdfReader(f)
        pdf_writer = PdfWriter()

        # 加密PDF文件
        pdf_writer.encrypt(password)

        for page_num in range(len(pdf_reader.pages)):
            pdf_writer.add_page(pdf_reader.pages[page_num])

        # 创建输出目录如果不存在
        os.makedirs(os.path.dirname(output_file), exist_ok=True)

        with open(output_file, "wb") as out_f:
            pdf_writer.write(out_f)

        print(Fore.GREEN + "PDF文件加密成功.")
        print(Fore.CYAN + "加密后的PDF文件已保存到:", output_file ,"\n")

if __name__ == "__main__":
    input_directory = input("输入需要加密的PDF文件所在目录: ")
    output_directory = input("输入保存加密后的 PDF 文件的目录: ")
    password = input("输入加密 PDF 文件所使用的密码: ")

    if not os.path.isdir(input_directory):
        print(Fore.RED + f"错误: 输入目录 '{input_directory}' 不存在.")
        exit(1)

    for root, dirs, files in os.walk(input_directory):
        for file in files:
            if file.endswith(".pdf"):
                input_file = os.path.join(root, file)
                relative_path = os.path.relpath(input_file, input_directory)
                output_file = os.path.join(output_directory, relative_path)
                encrypt_pdf(input_file, output_file, password)

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇