起因是最近在网上收集了一些 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)