gpt4 book ai didi

parsing - 以编程方式从 PDF 文件中提取文本(手动) - 丢失一些文本

转载 作者:行者123 更新时间:2023-12-02 21:09:33 26 4
gpt4 key购买 nike

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

我一直在尝试从 PDF 文件中提取文本以用于搜索小工具,但无法从某些 pdf 文件中提取文本。

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

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

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

我的目标是创建一个文本开膛手,从 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,因此根据字体,您必须使用不同的查找表。

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

当然我把这个过程过于简单化了,因为有几十种不同的标准编码、自定义编码(差分或ToUnicode),而且我们甚至没有接触过阿拉伯语、印地语、竖排日语字体、Type3字体等。有时文本根本无法提取,因为它被故意破坏。

关于parsing - 以编程方式从 PDF 文件中提取文本(手动) - 丢失一些文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com