PDF提取的文本似乎是不可读的

时间:2017-02-14 13:50:05

标签: pdf compression

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

Result

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

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

1 个答案:

答案 0 :(得分:1)

  

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

此假设仅适用于简单的PDF。

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

  

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

     

使用简单字体时,字符串的每个字节都应被视为单独的字符代码。然后在字体的编码中查找字符代码以选择字形,如9.6.6,"字符编码"中所述。

     

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

(第9.4.3节 - 文本显示操作符 - ISO 32000-1

因此,

  

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

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

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

  

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

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

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

此外,显示说明的文本顺序不必是阅读顺序。单词&#34; Hello&#34;可以例如首先绘制&#39; o&#39;然后向左,然后是&#39; el再次离开,然后是&#39; H&#39;然后向右,和最后剩下的&#39;。并且两个单词不需要用空格标记分隔,只是文本定位指令可能会稍微偏右。

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