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

2024-03-29

我确实遇到了一个问题,因为 cups-PDF 创建的 PDF 文档中的字符被映射到奇怪的符号 [在 Ubuntu Linux 14.04 和 16.04 上]。我认为它是某种 unicode,即使 Python 告诉我它的字符串类型。type(object)蟒蛇返回"string"

如果我通过鼠标复制粘贴从 evince / Firefox 或通过 Python PDFminer 模块从 PDF 中获取文本,则没有区别。所以确实如此,PDF 已经损坏了在 PDF 文档本身上正确呈现的文本信息。我不知道,但 PDF 文档中的文本和文本图形似乎并没有非常紧密地结合在一起。

当我从这样创建的 PDF 文档中复制文本时,名称“Raphael”变成了"✡✍✑✒✍☛✓"所以每个字符都映射到"✡=R ✍=a ✑=p ✒=h ✍=a ☛=e ✓=l"

另一个例子是:"Devel"变成"✭☛✮☛✓"

我怎样才能在Python中编写一个函数来将这个“错误”信息转换为正确的信息? PDF 文档中的所有内容都完全可读。

这与 cups-PDF 使用 postscript 创建 PDF 但未向文档添加正确的字体/字符信息有关。

如果信'l'始终是符号'✓'这是哪个复选标记 unicode 字符 http://www.fileformat.info/info/unicode/char/2713/index.htm

如何将这种奇怪的表示形式中的字符重新映射为 Python 中的正确表示形式?那么我该如何移动或重新映射符号'✓'写信'l'?任何想法?

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


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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将扰乱的 PDF 字符重新映射为可读文本 的相关文章

随机推荐

  • 需要在SQL Server 2008中使用CTC来实现业务需求

    对小规模的实施会有很大的帮助SP以满足以下要求 业务规则是 EndDate 应该是下一个规则的开始日期 否则规则不应该是 视为连续的 并将被视为其他规则系列 如 在下面的示例中显示有两个系列 因为第四个系列 它已经打破了记录 RuleId
  • 如何使用 Fish shell 设置宝石路径?

    如何使用 Fish shell 正确设置宝石路径 sanoy nice system D c h bellevue gt gem 安装包 警告 您的 PATH 中没有 home sanoy gem ruby 2 2 0 bin gem 可执
  • 如何使用java/spring boot读取Vault kv

    我正在尝试弄清楚如何使用Hashicorp s Vault与弹簧靴 最初 我尝试遵循该指南 https spring io guides gs vault config scratch https spring io guides gs v
  • Xcode 8 不显示整个 NSLog 输出

    今天升级到 Xcode 8 GM 后 我注意到 NSLog 没有将整个日志消息打印到控制台 当处理下载大量信息的 API 时 这一点尤其明显 例如 REST API 从数据库下载所有产品 它只显示第一个产品的前 30 个键 其余信息被裁剪
  • 在 Ruby 中实现贝叶斯分类器?

    我想实现一个简单的贝叶斯分类系统来对短信进行基本的情感分析 欢迎在 Ruby 中实施的实用建议 除贝叶斯之外的其他方法的建议也将受到欢迎 Ilya Grigorik 在这篇博客文章中对这个问题有一个很好的答案贝叶斯分类器 http www
  • 为什么一个整型变量在赋值给另一个变量后仍然可以使用?

    我试图了解 Rust 中的所有权是如何运作的 考虑以下简单示例 let u own 3432 let d own u own println u own 编译器不会抱怨 尽管所有权来自值3432已移至d own 最后一条语句是println
  • OpenCV中求已知纵横比的矩形的距离

    我正在开发一个 OpenCV 程序来查找从相机到具有已知长宽比的矩形的距离 求出从前向视图看到的到矩形的距离效果很好 实际距离与计算出的距离非常接近 wtarget pimage d c 2 ptarget tan fov 2 Where
  • AngularJS - $cancelRequest 在 $resource 中不可用

    我正在尝试触发中止请求 但是我没有收到 cancelRequest对象的结果 resource 但是 我能够得到 promise and resolved对象 为什么会发生这种情况 我怎样才能得到这个 cancelRequest PS 我正
  • 尝试通过 SSH 连接到远程主机时出错

    我正在尝试连接到远程主机以发出命令 但在运行代码时收到以下错误消息 ssh 握手失败 ssh 没有通用的密钥交换算法 客户提供 电子邮件受保护 cdn cgi l email protectionecdh sha2 nistp256 ecd
  • Hive 函数替换列值中的逗号

    我有一个配置单元表 其中字符串列的值为 12 345 有没有什么方法可以在插入此配置单元表期间删除逗号的配置单元函数 您可以使用regexp replace string INITIAL STRING string PATTERN stri
  • vbscript 使用 Ccur 四舍五入到小数点后两位

    我在用CCur 代替CDbl 正如这个问题中的回答 vbscript 数学表达式不起作用 https stackoverflow com questions 13569944 vbscript mathematical expression
  • 如何在 JTextPane 中为文本和下划线设置不同的颜色?

    刚刚尝试为 JTextPane 中的文本着色 但问题是文本和下划线不能有不同的颜色 我应该怎么做或者这是否可能 下面的示例以红色打印所有文本和下划线 JTextPane pane new JTextPane StyleContext con
  • 事件未在首页加载时加载,但在刷新后有效

    我正在创建一个名为员工管理系统的应用程序Rails 7 为了添加员工 我创建了一个表单 在这里 我使用nested form fields gem 来添加员工的联系人 问题是当第一次加载表单时 当我想添加或删除联系人字段时 它会重定向到同一
  • 从 dplyr 中选择函数时出错

    当我使用 dplyr 中的 select 函数时 它不起作用 并给出一个错误 指出我要选择的列名称是未使用的参数 但是 如果我在函数调用之前指定 dplyr 如 s dplyr select 那么它会正常工作 这是一个示例 df sampl
  • GCE:如何创建从外部端口80到内部端口5555的转发规则

    我第一次使用谷歌计算引擎 我想设置一个网络负载平衡器 具有静态IP 侦听端口80 但转发到侦听端口5555的后端服务器 我发现的所有示例都显示转发80到80 这在以下方面没有帮助我的情况 ref https cloud google com
  • 许多元素上的 ngClass 使网站非常慢

    我目前正在我的 Angular 6 应用程序中制作一个树视图 我正在使用它 嵌套和所有内容 我遇到的问题之一是 当我的页面有很多元素 几千个 并且它们都有 ngClass 在它们上 根据所选节点显示不同的颜色 页面往往会挂起很多 我创建了一
  • 通过鼠标单击并拖动绘制矩形 - javascript

    我试图在 Javascript 中绘制一个矩形 实际上是一个选择框 以选择选择中的 SVG 元素 我尝试修复单击并拖动矩形的代码 http jsfiddle net 7uNfW 26 http jsfiddle net 7uNfW 26 但
  • 如何在同一应用程序中运行 Spring Boot 管理客户端和服务器

    我想在同一个应用程序中运行 spring boot 管理服务器和客户端 我更改了服务器端口 当我更改服务器端口时 spring admin 将访问我更改的端口 这样我就可以运行管理服务器 但我看不到我的网络应用程序页面 我需要这样的输出 本
  • 根据请求更改表单字段

    应用程序有一个类别字段 可以在会话中设置 也可以不设置 如果是 我不想看到表单上的字段 只需将其作为隐藏字段 其值等于请求中的值 如果未设置 那么我想显示一个下拉菜单 我已经设置了表单以包含下拉列表 这是该字段的默认设置 我的问题是 将小部
  • 将扰乱的 PDF 字符重新映射为可读文本

    我确实遇到了一个问题 因为 cups PDF 创建的 PDF 文档中的字符被映射到奇怪的符号 在 Ubuntu Linux 14 04 和 16 04 上 我认为它是某种 unicode 即使 Python 告诉我它的字符串类型 type