将加扰的PDF字符重新映射为可读文本

时间:2017-04-18 07:57:26

标签: python unicode character remap

我确实遇到问题,因为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'?有什么想法吗?

为什么我需要这个? 我需要在这些文档中搜索文本值。

1 个答案:

答案 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
相关问题