python - 如何从 PDF 内容中提取(十六进制编码)文本?
问题描述
我有两个版本的 PDF,我知道它们略有不同— 第 3 页灰色栏中的“重新评估”文本:
我正在尝试在我的机器上获取文本差异。
我使用pdfcpu从多页 PDF中提取内容diff
,然后通过实用程序运行第 3 页:
% diff out_orig/page_3.txt out_new/page_3.txt
1650a1651,1658
> BT
> 1 0 0 rg
> 0 i
> /RelativeColorimetric ri
> /C2_2 9.96 Tf
> 0 Tw 358.147 648.779 Td
> <0035004800440056005600480056005600500048005100570003003000580056005700030032004600460058005500030028005900480055005C0003001600030030005200510057004B0056>Tj
> ET
我在 PDF 参考中查找了7.3.4.3 十六进制字符串:
十六进制字符串应写为编码为 ASCII 字符并括在尖括号内的十六进制数字序列。
所以我认为我应该能够做一些简单的事情,比如将十六进制字符直接解释为 ASCII 文本:
>>> s = '0035004800440056005600480056005600500048005100570003003000580056005700030032004600460058005500030028005900480055005C0003001600030030005200510057004B0056'
>>> import binascii
>>> binascii.a2b_hex(s)
b'\x005\x00H\x00D\x00V\x00V\x00H\x00V\x00V\x00P\x00H\x00Q\x00W\x00\x03\x000\x00X\x00V\x00W\x00\x03\x002\x00F\x00F\x00X\x00U\x00\x03\x00(\x00Y\x00H\x00U\x00\\\x00\x03\x00\x16\x00\x03\x000\x00R\x00Q\x00W\x00K\x00V'
但我越来越垃圾了。即使没有空字节:
>>> binascii.a2b_hex(s).replace(b'\x00', b'')
b'5HDVVHVVPHQW\x030XVW\x032FFXU\x03(YHU\\\x03\x16\x030RQWKV'
我希望它看起来像这样(相反):
>>> binascii.b2a_hex(b'Reassessment Must Occur Every 3 Months')
b'52656173736573736d656e74204d757374204f636375722045766572792033204d6f6e746873'
我在这个有点相关的 SO 帖子上找到了这个评论:
文字字符串 (7.3.4.2) - 这非常简单,因为您只需遍历 "(.?)" * 的数据 - 这仅适用于使用标准字体编码的简单示例。同时,嵌入式字体的自定义编码变得非常普遍。
所以......也许那个十六进制字符串不仅仅是十六进制编码的ASCII?
我在尝试提取文本差异时缺少什么?
解决方案
开始了:
>>> s = '0035004800440056005600480056005600500048005100570003003000580056005700030032004600460058005500030028005900480055005C0003001600030030005200510057004B0056'
>>> ns = [29 + int(c, 16) for c in chunks(s, 4)]
>>> print(bytes(ns))
b'Reassessment Must Occur Every 3 Months'
chunks
从这里复制。
推荐阅读
- vue.js - Vue + Vuetify 为移动端定制日历组件
- reactjs - 在 React App 中使用 axios 在 CakePHP API 中执行 PUT 方法时,在预检选项中未找到 404 错误
- java - getSupportLoaderManager(id, args, ??) 的第三个参数类型是什么
- android - Android 获取/设置 ImageView 的值
- asp.net-core - RabbitMq 包中缺少“PublishAsync”
- amazon-web-services - AWS API 网关服务编排
- python-3.x - 如何迭代两个字典并使用值进行计算,以键为条件?
- powerbi - DAX:如何选择每个日期和每个月的最大值
- reactjs - Material-ui 的 CardActionArea 组件属性的打字稿错误
- angular - 具有 SPA 和 MPA 方法的 Angular + net Core 应用程序