我确实遇到问题,因为cups-PDF创建PDF文档,其中字符映射到奇怪的符号[在Ubuntu Linux 14.04和16.04上}。即使Python告诉我它的字符串类型,我认为它是某种unicode。 type(object)
python返回"string"
如果我通过来自evince / Firefox的鼠标复制粘贴或Python PDFminer模块从PDF中获取文本没有区别。因此,PDF确实破坏了PDF文档本身正确的文本信息。我不知道这一点,但PDF文档上的文字和文字图形似乎没有紧密联系在一起。
当我通过示例从这样创建的PDF文档中复制文本时,名称“Raphael”变为"✡✍✑✒✍☛✓"
,因此每个单个字符都映射到"✡=R ✍=a ✑=p ✒=h ✍=a ☛=e ✓=l"
另一个例子是:"Devel"
变成"✭☛✮☛✓"
如何在Python中编写一个函数,将这个“错误”信息转换为正确的信息?在PDF文档中,一切都是完全可读的。
这与cup-PDF有关,使用postscript创建PDF但不向文档中添加正确的字体/字符信息。
如果字母'l'
始终是符号'✓'
,则checkmark unicode character
如何在这个奇怪的表示中重新映射字符以纠正Python中的表示?那么如何将符号'✓'
转换或重新映射到字母'l'
?有什么想法吗?
为什么我需要这个? 我需要在这些文档中搜索文本值。
答案 0 :(得分:2)
PDF似乎使用专门的字体来防止复制。文本是加扰,但字体中的字母也是如此。因此,如果a
曾经映射到Unicode代码点U + 0061,则PDF已经用U + 270D替换了所有那些,而特殊字体用字母a替换了正常的“WRITING HAND”字形。
换句话说,它使用substitution cypher。
您必须像任何其他替换密码一样解密此问题:您需要创建从加密代码点到未加密代码点的反向映射。您可以使用PDF作为指南;作为人类,您可以轻松阅读实际文本,还可以看到它与复制的Unicode代码点的关系。
例如,我们知道U + 270D映射到U + 0061:
>>> hex(ord('✍'))
'0x270d'
>>> hex(ord('a'))
'0x61'
因为从PDF复制a
时,您获得了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将处理其余的事情。
在样本加密文本样本上使用上述部分表进行演示:
>>> print("✡✍✑✒✍☛✓".translate(mapping))
Raphael
>>> print("✭☛✮☛✓".translate(mapping))
Devel