Python实现PDF文件加密输出(更新了PyPDF2)

阅读本文大概需要 9 分钟。

ヾ(≧▽≦*)o

本文将分享利用 Python 对 PDF 进行加密实例,主要利用到PyPDF2 模块。

本文仅供学习交流,分享个人心得,转载请标明出处。

起因:

朋友突然发过来一个PDF文档帮忙加密,我给用Adobe Acrobat加个密就发回去了。加密的文档用的是访问加密,密码也很简单,是6位数字。

这时,联想起电脑磁盘加密BitLocker的加密方法,让我前段时间能在时隔四年忘记U盘密码的情况下使用密钥解锁尘封已久的U盘。

于是,我开始着手Pdf_encryptor.py(本文pdf加密程序名)。

文件结构:

程序目的:输入有效的.pdf文件绝对路径,程序生成加密后的.pdf文件至output文件夹,生成.txt的密钥文件至key文件夹。
  • Pdf_encryptor.py
    • 1.1 random_num(length)
    • 1.2 random_chara(length)
    • 1.3 create_sign_word()
    • 1.4 create_pass_word()
    • 1.5 pdf_encrypt(pdf_path, file_name, p_sign_word, p_pass_word)
    • 1.6 key_creator(file_name, k_sign_word, k_part_sign_word, k_pass_word)
  •         output 存储加密后的PDF文件
  •         key 存储加密过的PDF文件的密钥文件

所需Python库:os, string, random, PyPDF2 。

PyPDF2库的安装:cmd窗口使用 pip install PyPDF2 命令

正文部分

1.1 random_num(length) 生成数字字符串
# 生成指定长度(length)随机数
def random_num(length):
    # 存储生成的长随机数
    temp_create = ""
    for i in range(0, length):
        temp = str(random.randint(0, 9))
        temp_create += temp
    return temp_create
1.2 random_chara(length) 生成大写字母字符串
# 生成指定长度(length)大写字母
def random_chara(length):
    # 存储生成的长字符串
    temp_create = ""
    for i in range(0, length):
        temp = random.choice(Uppercase)
        temp_create += temp
    return temp_create
1.3 create_sign_word() 生成密钥标记

因为用的是BitLocker的密钥标记格式,所以略显复杂。

格式:XXX00000-000X-XXXX-000X-0000X00000X0

# 生成密钥标记(指定格式)
def create_sign_word():
    temp_create = ""
    temp_create += random_chara(3)
    temp_create += random_num(5)
    temp_create += "-"
    temp_create += random_num(3)
    temp_create += random_chara(1)
    temp_create += "-"
    temp_create += random_num(4)
    temp_create += "-"
    temp_create += random_num(3)
    temp_create += random_chara(1)
    temp_create += "-"
    temp_create += random_num(4)
    temp_create += random_chara(1)
    temp_create += random_num(5)
    temp_create += random_chara(1)
    temp_create += random_num(1)
    return temp_create
 1.4 create_pass_word() 生成密钥

这里也是用的BitLocker的密钥格式。

格式:000000-000000-00000-000000-000000-000000-000000-000000

(6个零一组,一共8组,中间用"-"隔开)

这里使用r.strip()去除密钥最右边的"-"

# 生成密钥(指定格式)
def create_pass_word():
    temp_create = ""
    for i in range(8):
        temp = random_num(6)
        temp += "-"
        temp_create += temp
    # 返回去除右侧"-"的字符串
    return temp_create.rstrip("-")
 1.5 pdf_encrypt(pdf_path, file_name, p_sign_word, p_pass_word) 加密PDF文件

这里参考了pipi的文章,但在编码调试过程中发现原文章中的代码在运行时报错。

仔细查看后发现。

PdfFileReader is deprecated and was removed in PyPDF2 3.0.0. Use PdfReader instead.

翻译一下是这样的:

PdfFileReader已弃用,并已在PyPDF2 3.0.0中删除。请改用PdfReader。

原来是PyPED2在3.0.0版本中已经停用了原本的函数名,改为了PdfReader!

这里可以明显看出这里保留了old_name,加入了new_name,并留下了替换说明。

于是按照提示更新了所有函数 。

# 进行PDF加密
def pdf_encrypt(pdf_path, file_name, p_sign_word, p_pass_word):
    pdf_file = open(pdf_path, 'rb')
    pdf_reader = PyPDF2.PdfReader(pdf_file)
    pdf_writer = PyPDF2.PdfWriter()
    for page_num in range(len(pdf_reader.pages)):
        page_obj = pdf_reader.pages[page_num]
        pdf_writer.add_page(page_obj)
    # 加密操作,密码为p_pass_word(个人理解,第一个参数为访问密码,第二个参数为修改密码)
    pdf_writer.encrypt('%s', '%s' % p_pass_word)
    # 以二进制写入,将保留原pdf中的信息
    pdf_output_file = open("output\\%s(%s).pdf" % (file_name, p_sign_word), 'wb')
    pdf_writer.write(pdf_output_file)
    pdf_output_file.close()
    print("PDF文件已成功加密!")
 1.6 key_creator(file_name, k_sign_word, k_part_sign_word, k_pass_word) 生成密钥文件

原BitLocker文件是长这个样子的:

这里还原了原本的格式,使用print进行文件的写入。

# 生成密钥文件
def key_creator(file_name, k_sign_word, k_part_sign_word, k_pass_word):
    key_path = "key\\PDF密钥 (%s) %s.txt" % (file_name, k_sign_word)
    key_file = open(key_path, 'a+')
    print("PDF加密密钥\n\n 密钥用于打开由生成器生成的密钥保护PDF上的数据。\n\n若要验证该密码是否为正确的密码,请将这些标记与待解锁PDF“()”显示的标记进行比较。\n\n", file=key_file)
    print("密钥标记: %s\n完整密钥标记: %s\n\n密钥:\n%s" % (k_part_sign_word, k_sign_word, k_pass_word), file=key_file)
    key_file.close()
    print("PDF密钥已成功生成!\n密钥文件位置:%s" % key_path)

完整代码 

# -*- coding: utf-8 -*-
# @Function: 生成随机密钥并加密PDF文件
# @Author:赴下
# @Time:2023
# @version:1.1
# 报错、自定义加密、GUI、打包为可执行文件尚未完成
# 仅供学习与参考,转载请标明出处

import os
import PyPDF2
import string
import random

# PDF文件路径
path = str(input("请输入要加密的PDF路径:")).strip("\"")
print("文件位置:" + path)
# PDF文件名
filename = os.path.basename(os.path.splitext(path)[0])
print("文件名:" + filename)
# 全部大写字母
Uppercase = string.ascii_uppercase
# 检测并生成目录(output:加密PDF输出,key:密钥)
if os.path.exists("output"):
    pass
else:
    os.mkdir("output")
if os.path.exists("key"):
    pass
else:
    os.mkdir("key")


# 生成指定长度(length)随机数
def random_num(length):
    temp_create = ""
    for i in range(0, length):
        temp = str(random.randint(0, 9))
        temp_create += temp
    return temp_create


# 生成指定长度(length)大写字母
def random_chara(length):
    temp_create = ""
    for i in range(0, length):
        temp = random.choice(Uppercase)
        temp_create += temp
    return temp_create


# 生成密钥标记(指定格式)
def create_sign_word():
    temp_create = ""
    temp_create += random_chara(3)
    temp_create += random_num(5)
    temp_create += "-"
    temp_create += random_num(3)
    temp_create += random_chara(1)
    temp_create += "-"
    temp_create += random_num(4)
    temp_create += "-"
    temp_create += random_num(3)
    temp_create += random_chara(1)
    temp_create += "-"
    temp_create += random_num(4)
    temp_create += random_chara(1)
    temp_create += random_num(5)
    temp_create += random_chara(1)
    temp_create += random_num(1)
    return temp_create


# 生成密钥(指定格式)
def create_pass_word():
    temp_create = ""
    for i in range(8):
        temp = random_num(6)
        temp += "-"
        temp_create += temp
    return temp_create.rstrip("-")


# 进行PDF加密
def pdf_encrypt(pdf_path, file_name, p_sign_word, p_pass_word):
    pdf_file = open(pdf_path, 'rb')
    pdf_reader = PyPDF2.PdfReader(pdf_file)
    pdf_writer = PyPDF2.PdfWriter()
    for page_num in range(len(pdf_reader.pages)):
        page_obj = pdf_reader.pages[page_num]
        pdf_writer.add_page(page_obj)
    # 加密操作,密码为p_pass_word(个人理解,第一个参数为访问密码,第二个参数为修改密码)
    pdf_writer.encrypt('%s', '%s' % p_pass_word)
    # 以二进制写入,将保留原pdf中的信息
    pdf_output_file = open("output\\%s(%s).pdf" % (file_name, p_sign_word), 'wb')
    pdf_writer.write(pdf_output_file)
    pdf_output_file.close()
    print("PDF文件已成功加密!")


# 生成密钥文件
def key_creator(file_name, k_sign_word, k_part_sign_word, k_pass_word):
    key_path = "key\\PDF密钥 (%s) %s.txt" % (file_name, k_sign_word)
    key_file = open(key_path, 'a+')
    print("PDF加密密钥\n\n 密钥用于打开由生成器生成的密钥保护PDF上的数据。\n\n若要验证该密码是否为正确的密码,请将这些标记与待解锁PDF“()”显示的标记进行比较。\n\n", file=key_file)
    print("密钥标记: %s\n完整密钥标记: %s\n\n密钥:\n%s" % (k_part_sign_word, k_sign_word, k_pass_word), file=key_file)
    key_file.close()
    print("PDF密钥已成功生成!\n密钥文件位置:%s" % key_path)


# if __name__ == 'main':
# 生成完整密钥标记
sign_word = create_sign_word()
# 生成密钥标记(取完整密钥标记前16位)
part_sign_word = sign_word[:16]
# 生成密钥
pass_word = create_pass_word()
# 打印密钥相关信息
print("密钥标记:%s\n完整密钥标记: %s\n密钥:%s\n" % (part_sign_word, sign_word, pass_word))
# 进行PDF加密
pdf_encrypt(path, filename, sign_word, pass_word)
# 生成密钥文件
key_creator(filename, sign_word, part_sign_word, pass_word)

上面代码的运行逻辑就是:检测目录是否存在,否则创建目录。调用以上定义的函数得到完整密钥标记(sign_word)、密钥标记(part_sign_word)、密钥(pass_word),配合其他参数运行PDF加密与生成密钥文件。

参考文章:使用python对文件进行加密——PDF文件加密_对一个pdf文件进行加密python_皮皮虾不皮呀的博客-CSDN博客

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值