代码之家  ›  专栏  ›  技术社区  ›  Brian

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

  •  3
  • Brian  · 技术社区  · 14 年前

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

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

    作为第一步,我使用下面的策略创建了一个非常简单的pdf解析器 project << >> 块,但我的理解是这是针对十六进制编码的数据块,它似乎不在我无法解析的测试文件中…或者至少我看不到它们。

    iText.Net 但也失败了 PDFMiner PDFBox

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

    1 回复  |  直到 11 年前
        1
  •  16
  •   Tamas Demjen    14 年前

    从PDF文件中提取内容可能会有点复杂。我每天都做这件事,我想我能给你指出正确的方向。

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

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

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

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

    另一个有趣的操作符是文本显示(通常 TJ Tj ). 使用Type0(CID)字体 Tj公司 Tj公司 使用十六进制字符串,例如 <000100a50056> Tj (Hello, World) Tj 你所熟悉的。不管怎样,字符串都是不可读的,如果不完全解析页面,包括页面的所有字体资源,尤其是ToUnicode cmap,它本身就是一个PostScript对象,但您只关心十六进制部分,就无法提取字符串。

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