PDF 似乎使用了专门的字体来防止复制。文字是炒的,但字体中的字母也是如此。因此,如果a
一旦映射到 Unicode 代码点 U+0061,PDF 就会用 U+270D 替换所有这些 a,并且特殊字体用字母 a 替换正常的“WRITING HAND”字形。
换句话说,它使用替换密码 https://en.wikipedia.org/wiki/Substitution_cipher.
您必须像任何其他替换密码一样对其进行解读:您需要创建从加密代码点到未加密代码点的反向映射。您可以使用 PDF 作为指南;作为人类,您可以轻松阅读实际文本,还可以了解它与复制的 Unicode 代码点的关系。
例如,我们知道 U+270D 映射到 U+0061:
>>> hex(ord('✍'))
'0x270d'
>>> hex(ord('a'))
'0x61'
因为当你复制一个a
从 PDF 中,您得到了270d
代码点代替。只需为其余字母表建立一个表格即可。这听起来像是大量的手动工作,但您已经有了明文。想象一下不知道文本包含什么(例如,您只有复制文本产生的符号);那么你必须首先进行完整的密码分析(对于替换密码,假设一种特定的语言,并计算符号;每种语言的字母都有一个典型的频率分布,这种分布通常可以在加密的文本正文中匹配映射回原始字母)。
理论上,您应该能够提取专用字体,然后对其进行分析以生成翻译表。然而,这需要某种形式的计算机视觉;计算机不会轻易知道像素光栅或一系列矢量线形成特定的字母。对于大约 70 个代码点(大写、小写、数字、一些标点符号),手动创建表格可能会更容易。
一旦你有了一个表,Python 就可以为你做翻译;我已经根据您的线索并为这些字母创建了一个部分表格:
mapping = {
0x270d: 'a',
0x261b: 'e',
0x2712: 'h',
0x2713: 'l',
0x2711: 'p',
0x272e: 'v',
0x272d: 'D',
0x2721: 'R',
}
print(encrypted.translate(mapping))
您所需要做的就是填写剩余的映射;这str.translate() method https://docs.python.org/3/library/stdtypes.html#str.translate然后将处理其余的事情。
在示例加密文本示例中使用上述部分表进行演示:
>>> print("✡✍✑✒✍☛✓".translate(mapping))
Raphael
>>> print("✭☛✮☛✓".translate(mapping))
Devel