2017-02-14 109 views
1

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

Result

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

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

回答

1

我认为会有括号之间可读文本在Tj命令之前

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

文本表示操作者的字符串操作数应被解释为识别该字符的字形代码序列被涂:

为了从PDF规格(ISO 32000-1)引用。

使用简单的字体,字符串的每个字节应被视为单独的字符代码。然后按照字体的编码查找字符代码以选择字形,如第9.6.6节“字符编码”中所述。

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

(第9.4.3节 - 文本显示运营商 - ISO 32000-1

因此,

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

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

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

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

由于用文字说明的字符串参数的编码依赖于当前的字体,你至少需要跟踪当前的字体名称(TF指令)和查找编码信息(编码ToUnicode map)从当前字体对象。

第9.10节 - 文本内容提取 - ISO 32000-1对此进行了更详细的解释。

此外,显示指令的文本顺序不一定是阅读顺序。单词“你好”可以例如首先画出'o',然后向左,然后'el',然后再离开,然后'H',然后向右,最后剩下'l'。而且两个单词不需要用空格字形分隔,只需要一个文本定位指令即可。

因此,一般来说,您还必须跟踪绘制的单独字符串的位置。