【问题标题】:PDF extracted text seems to be unreadablePDF 提取的文本似乎不可读
【发布时间】:2017-02-14 13:50:04
【问题描述】:

情况:我有一个使用 1.6 版的 PDF。在该 PDF 中,有几个流。这些流中有压缩文本 (Flate),所以我解压缩了这些流。之后,我提取了相应的解压缩流的 Tj 部分。我假设 Tj 命令之前的括号之间会有可读的文本,但结果如下:

实际问题:因为我不知道,我有什么,我想知道它是什么类型的内容。此外:是否可以从这些字符串中获取纯文本,还是需要更多信息来提取纯文本?

进一步研究:我尝试分析由 iTextSharp 生成的 PDF(似乎是用于生成 PDF 的 C# 库)。不知道是否是相关信息,但可能是图书馆使用了一种特殊的方式来加密它的文本数据或其他东西......

【问题讨论】:

    标签: pdf compression


    【解决方案1】:

    我假设在 Tj 命令之前的括号之间会有可读的文本

    这个假设只适用于简单的 PDF。

    引用 PDF 规范 (ISO 32000-1):

    文本显示运算符的字符串操作数应被解释为标识要绘制的字形的字符代码序列。

    对于简单字体,字符串的每个字节都应被视为一个单独的字符代码。然后应在字体的编码中查找字符代码以选择字形,如 9.6.6 “字符编码”中所述。

    对于复合字体 (PDF 1.2),可以使用多字节代码来选择字形。在这种情况下,字符串的一个或多个连续字节应被视为单个字符代码。代码长度以及从代码到字形的映射在称为 CMap 的数据结构中定义,如 9.7“复合字体”中所述。

    (第 9.4.3 节 - 文本显示运算符 - ISO 32000-1

    因此,

    我想知道它是什么类型的内容。

    如上所述,这些“字符串”由单字节或多字节字符代码组成。这些代码取决于当前字体的编码。 PDF 中的每个字体对象都可以有不同的编码。

    这些编码可能是一些标准编码(MacRomanEncodingMacExpertEncodingWinAnsiEncoding)或一些自定义编码。特别是在嵌入字体子集的情况下,您经常会发现编码,其中 1 是页面上绘制的第一个字形的代码,2 是第二个字形的代码,不同的字形,3 代表第三个,不同的一个,等等。

    此外:是否可以从这些字符串中获取纯文本,或者我是否需要更多信息来提取纯文本?

    由于文本显示指令的字符串参数的编码取决于当前字体,因此您至少需要跟踪当前字体名称(Tf指令)并查找编码信息(Encoding 或 ToUnicode 映射)来自当前字体对象。

    ISO 32000-1 的第 9.10 节 - 文本内容的提取 - 更详细地解释了这一点。

    此外,显示说明的文本顺序不必是阅读顺序。 “你好”这个词可以例如首先绘制“o”,然后向左,然后是“el”,然后再次向左,然后是“H”,然后向右,最后是剩余的“l”。并且两个单词不需要用空格字形分隔,只是可能会有一个文本定位指令向右一点。

    因此,通常您还必须跟踪绘制的单独字符串的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多