python - PyPDF2<=1.19 存在 PDF 编码问题

标签 python encoding pypdf

我正在尝试使用 PyPDF2 在 Python 3.3.2 下加密 PDF 文件。

代码很简单:

password = 'password';
# password = password.encode('utf-8')
PDFout.encrypt(user_pwd=password,owner_pwd=password)

但是我收到以下错误,具体取决于编码是打开还是关闭:

on: TypeError: slice indices must be integers or None or have an __index__ method

off: TypeError: Can't convert 'bytes' object to str implicitly

您知道如何解决该问题吗?

感谢和问候 彼得

最佳答案

在我看来,当前版本的 PyPDF2(撰写本文时为 1.19)存在一些与 Python 3 兼容性有关的错误,这就是导致这两条错误消息的原因。 PyPDF2 的 GitHub 上的更改日志表明,在 1.16 版本中添加了对 Python 3 的支持,该版本仅在 3 1/2 个月前发布,因此该错误可能尚未报告或修复。 GitHub 还显示该项目有一个专门用于 Python 3.3 支持的分支,目前尚未合并回主分支。

这两个错误都发生在 PyPDF2 模块的 pdf.py 文件中。这是正在发生的事情:

PyPDF2 模块创建一些额外的字节作为填充,并将其与您的密码连接起来。如果 Python 版本小于 3,则填充将创建为字符串文字。如果版本为 3 或更高,则使用“latin-1”编码对填充进行编码。在 Python 3 中,这意味着填充是一个字节对象,并将其与字符串对象(您的密码)连接起来会产生您看到的 TypeError。在 Python 2 下,串联可以工作,因为两个对象都是相同的类型。

当您使用“utf-8”对密码进行编码时,您可以解决该问题,因为在这种情况下密码和填充都是字节对象。但是,您最终会在模块后面遇到第二个错误。 pdf.py 文件创建并使用变量“keylen”,如下所示:

keylen = 128 / 8
... # later on in the code...
key = md5_hash[:keylen]

除法运算符在 Python 2.2 中发生了变化,从 Python 3 开始改变了它的默认行为。简而言之,“/”在 Python 2 中表示向下除法并返回一个 int,但在 Python 3 中表示真正的除法并返回一个漂浮。因此,“keylen”在 Python 2 中为 16,但在 Python 3 中为 16.0。与整数不同, float 不能用于拼接数组,因此 Python 3 会抛出您在计算 md5_hash[:keylen] 时看到的 TypeError。 Python 2 运行它不会出现错误,因为 keylen 是一个 int。

您可以通过更改模块的源代码以使用“//”运算符(这意味着楼层除法并在 Python 2 和 3 中返回 int)来解决第二个问题:

keylen = 128 // 8

但是,您稍后会在代码中遇到第三个错误,也与 Python 3 兼容性有关。我不会通过描述来详细说明这一点。那么,据我所知,对你的问题的简短回答是要么使用Python 2,要么修补各种代码兼容性问题,或者使用对Python 3有更好支持的不同Python PDF库(如果存在的话)满足您的特定要求)。

关于python - PyPDF2<=1.19 存在 PDF 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19371101/

相关文章:

python - 根据对值删除 Pandas 数据框中的行

python - Pandas: reshape 和多索引

python - bash 运行 python 脚本时出现语法错误

string - 检查 unicode 值是否在 Erlang 二进制字符串中?

mysql - 对于使用 utf-8 编码的数据库,char 还是 varchar 更好?

c# - 如何在 C# 中将特殊字符替换为其等效字符(例如 "á "为 "a")?

python - 当 PyPDF2 正在解析的 PDF 损坏时,我可以让 PyPDF2 优雅地失败吗?

python - 使用 Selenium 和 Python 以通用方式解析表数据

python - 从多份 PDF 格式的简历中提取信息

python - pyPdf PdfFileReader 与 PdfFileWriter