文章目录
- [Part.I Introduction](#Part.I Introduction)
- [Part.II 破除编辑密码](#Part.II 破除编辑密码)
-
- [Chap.I 准备工作](#Chap.I 准备工作)
- [Chap.II 源码](#Chap.II 源码)
- [Chap.III 调用实例](#Chap.III 调用实例)
- [Part.III 破除打开密码](#Part.III 破除打开密码)
-
- [Chap.I 准备工作](#Chap.I 准备工作)
- [Chap.II 源码](#Chap.II 源码)
- [Chap.III 调用实例](#Chap.III 调用实例)
- [Part.IV 添加打开密码](#Part.IV 添加打开密码)
-
- [Chap.I 准备工作](#Chap.I 准备工作)
- [Chap.II 源码](#Chap.II 源码)
- [Chap.III 调用实例](#Chap.III 调用实例)
- [Part.X 其他](#Part.X 其他)
- Reference
Part.I Introduction
一般遇到的 PDF 有两种加密类型:一是打开加密,二是编辑加密。本文介绍了针对此两种加密类型的解密方法。另外,还介绍了如何给 PDF 文件添加打开密码。(已附所有源码,内容均来源于网络。)

Part.II 破除编辑密码
就是要达到下面的效果

Chap.I 准备工作
首先安装几个包
python
pip install pypdf2
pip install pycryptodome
Chap.II 源码
python
from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法
"""
如果是python2的将上面的PdfReader和PdfWriter改为
PdfFileReader和PDFfileWriter即可
"""
from Crypto.Cipher import AES #高加密的方法,要引入不然会报错
def get_reader(filename, password): #读取pdf的方法(自定义函数)
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) #读取pdf文件
"""如果是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() #如果pdf文件已经在本地了就关闭
return pdf_reader #返回读出pdf的值
def deception_pdf(filename, password, decrypted_filename=None): #生成新pdf的方法(自定义函数)
print('正在生成解密...')
#得到传入的文件名和密码(这里不用做修改)
pdf_reader = get_reader(filename, password)
if pdf_reader is None:
return print("无内容读取")
"""如果是python2将is_encrypted改为isEncrypted"""
if not pdf_reader.is_encrypted:
return print('文件没有被加密,无需操作')
"""如果是python2将PdfWriter改为PdfFileWriter"""
pdf_writer = PdfWriter() #写pdf(记录pdf内容)
"""如果是python2将append_pages_from_reader改为appendPagesFromReader"""
pdf_writer.append_pages_from_reader(pdf_reader)
if decrypted_filename is None: #创建解密后的pdf文件和展示文件的路径
decrypted_filename = "".join(filename.split('.')[:-1]) + '_' + '已解密' + '.pdf'
print("解密文件已生成:{}".format(decrypted_filename))
# 写入新文件
pdf_writer.write(open(decrypted_filename, 'wb'))
return
Chap.III 调用实例
python
deception_pdf(r'A:\documnets\b.pdf','')
调用之后会在目录A:\documnets下生成没有编辑密码的b_已解密.pdf文件
Part.III 破除打开密码
声明:下面的代码是针对"你有现成的密码集,但不确定哪个密码是正确的"情况!!!
Chap.I 准备工作
安装下面几个包
python
pip install pypdf2
pip install pikepdf
pip install tqdm
准备一个密码集rockyou.txt,戳我可下载一个准备好的密码集。(里面有1400万个密码)
Chap.II 源码
python
from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法
import pikepdf #是用来读取pdf文件
from tqdm import tqdm # 用来读取进度条
def userCrak(filePathName, wordPathList):
filename = filePathName # pdf文件路径
wordlist = wordPathList # 密码字典路径
n_words = len(list(open(wordlist, 'rb')))
fp = open(filename, "rb+")
pdfFile = PdfReader(fp) # python2用PdfFileReader
with open(wordlist, "rb") as wordlist:
if pdfFile.is_encrypted: # python2为getIsEncrypted
for word in tqdm(wordlist, total=n_words, unit="word"): # 显示进度条
try:
pikepdf.open(filename, password=word.strip()) #打开文件查看是否能打开
except:
continue
else:
passwords = word.decode().strip() # 得到的密码
print(f"已经查找到密码为:{passwords}")
return passwords
return print("!密码没有找到, 请尝试使用其他的密码词典!")
def decrypt(filePathName, userPasswordName):
"""如果是Python2用PdfFileReader"""
pdf_reader = PdfReader(fr'{filePathName}') # 输入你想要操作的pdf加密的文档的位置/名称
pdf_reader.decrypt(f'{userPasswordName}') # 加入解密的密码
"""如果是Python2用PdfFileWriter"""
pdf_writer = PdfWriter()
"""如果是python2将append_pages_from_reader改为appendPagesFromReader"""
pdf_writer.append_pages_from_reader(pdf_reader)
pdf_writer.write(open(filePathName, 'wb')) # 写文件
print("!!!原PDF文件打开密码已去除!!!")
return
Chap.III 调用实例
python
filenamePath = r"D:\a.pdf" # pdf文件路径
wordlistPath = r"D:\rockyou.txt" # 密码字典路径
userPassword = userCrak(filenamePath, wordlistPath) # 得到解密的密码
decrypt(filenamePath, userPassword) # 将解密的密码和文件路径填入,会覆盖掉原文件
Part.IV 添加打开密码
Chap.I 准备工作
安装下面的包(若已安装则忽略)
python
pip install pypdf2
想一个密码,比如123456
Chap.II 源码
python
from PyPDF2 import PdfReader #pdf的读取方法
from PyPDF2 import PdfWriter #pdf的写入方法
def encrypt_pdf(input_pdf, output_pdf, password):
pdf_reader = PdfReader(input_pdf)
pdf_writer = PdfWriter()
for page in range(len(pdf_reader.pages)):
pdf_writer.add_page(pdf_reader.pages[page])
pdf_writer.encrypt(password)
with open(output_pdf, 'wb') as f:
pdf_writer.write(f)
return
Chap.III 调用实例
python
inPath=r'A:\c.pdf'
outPath=r'A:\c_已加密.pdf'
pwd='123456'
encrypt_pdf(inPath,outPath,pwd)
Part.X 其他
- 想要减少 pdf 的大小可以用
adobe acrobat在另存的时候勾选『减小文件大小』。 - 想要添加编辑 pdf 的密码可以用
adobe acrobat在另存的时候勾选『限制编辑』