Parsing 通过编程从PDF文件中删除文本(手动)-缺少一些文本

Parsing 通过编程从PDF文件中删除文本(手动)-缺少一些文本,parsing,language-agnostic,pdf,Parsing,Language Agnostic,Pdf,注意:我对使用解析库不感兴趣。这是我自己的娱乐节目 我一直在尝试从PDF文件中提取文本作为搜索工具,但无法从某些PDF文件中提取文本 注意,这是一个比直接解析容易得多的问题;我不在乎是否无意中在输出中包含了一些垃圾,也不在乎文档的格式是否完整。我甚至不在乎这些话是否按顺序说出来 作为第一步,我使用本文中的策略创建了一个非常简单的pdf解析器。基本上,它所做的就是搜索pdf文件中的zlib流,对它们进行压缩,并提取在括号中找到的任何文本。这无法解析卡在块中的数据,但我的理解是,这是针对十六进制编码

注意:我对使用解析库不感兴趣。这是我自己的娱乐节目

我一直在尝试从PDF文件中提取文本作为搜索工具,但无法从某些PDF文件中提取文本

注意,这是一个比直接解析容易得多的问题;我不在乎是否无意中在输出中包含了一些垃圾,也不在乎文档的格式是否完整。我甚至不在乎这些话是否按顺序说出来

作为第一步,我使用本文中的策略创建了一个非常简单的pdf解析器。基本上,它所做的就是搜索pdf文件中的zlib流,对它们进行压缩,并提取在括号中找到的任何文本。这无法解析卡在
块中的数据,但我的理解是,这是针对十六进制编码的数据块,它似乎不在我无法解析的测试文件中……或者至少我没有看到它们

同样地,也失败了,尽管成功了。然而,后两个项目有太多的间接层次,不容易检查;我很难弄清楚他们到底在做什么,部分原因是我并没有真正使用这两种语言,以至于不习惯以任何重要的方式调试它


我的目标是创建一个文本裂土器,在尽可能不了解pdf格式本身的情况下从pdf文件中抓取文本(例如,我的测试解析器从括号中抓取文本,但不知道它正在检查的pdf的哪一部分是标题)。

从pdf文件中提取内容可能会有点复杂。这是我的日常工作,我想我可以为你指出正确的方向

您试图做的(在括号之间提取字符串)仅适用于简单的WinAnsi或MacRoman编码,用于Type1或TrueType字体。不幸的是,这些单字节编码不支持正确的Unicode内容。您的示例文档使用Type0又名CID字体,其中每个字符由字形索引标识。这些是非标准的特殊编码,字体设计者可以任意方式为任何字符指定字形索引。有时PDF的制作者故意破坏编码

它的工作方式是从目录开始,解析页面树。一旦识别了页面对象,就可以解析其内容及其资源。资源字典包含页面使用的字体列表。每个CID字体对象都包含一个ToUnicode流,它是一个cmap(字符映射),用于建立字形索引与其Unicode值之间的关系。例如:

<01> <0044>
<02> <0061>
<03> <0074>
<04> <0020>

这意味着字形01是Unicode U+0044,字形02是U+0061,依此类推。必须使用此查找表将字形ID转换回Unicode

页面内容本身有两个重要的操作符。
Tf
是字体选择器,这很重要,因为它标识字体对象。每种字体都有自己的ToUnicode cmap,因此根据字体的不同,必须使用不同的查找表

另一个有趣的操作符是文本显示(通常是
TJ
TJ
)。对于Type0(CID)字体,
Tj
不包含人类可读的文本,而是一系列字形ID,您应该在上述cmap的帮助下映射到Unicode。通常,
Tj
使用十六进制字符串,例如
Tj
,而不是您熟悉的更典型的
(Hello,World)Tj
。无论哪种方式,字符串都不是人类可读的,并且在没有完全解析页面(包括其所有字体资源)的情况下无法提取,尤其是ToUnicode cmap,它本身就是一个PostScript对象,但您只关心十六进制部分


当然,我过于简化了过程,因为有几十种不同的标准编码、自定义编码(差分或ToUnicode),我们甚至没有涉及阿拉伯语、印地语、垂直日语字体、Type3字体等。有时文本根本无法提取,因为它是故意损坏的。

你打算对jpeg或类似的图像文本怎么办?@drachenstern:我打算忽略图像。我想问一下,因为我看到很多PDF格式的文本都是图像格式的。这很糟糕。只要你没有压缩对象(另一个对象的对象流中的对象-请参见),这应该可以正常工作。我们写了一篇关于文本流如何工作的文章。谢谢。这就解释了很多让我困惑的地方。