对PDF文档中文本的扁平编码部分进行解码

对PDF文档中文本的扁平编码部分进行解码,pdf,ms-word,deflate,textedit,pdf-parsing,Pdf,Ms Word,Deflate,Textedit,Pdf Parsing,我正在分析两个简单的pdf文件。这两个文件都包含一行文本(“ZYXWVUTSRQQRSTUVWXYZ”),是在Mac OS X上创建的 第一个文件是用TextEdit创建的。只有三个流,看第一个流(用peepdf自动解码)可以清楚地显示文本 PPDF> stream 4 q Q q 72 707.272 468 12.72803 re W n /Cs1 cs 0 sc q 0.9790795 0 0 -0.9790795 72 720 cm BT 0.0001 Tc 11 0 0 -11

我正在分析两个简单的pdf文件。这两个文件都包含一行文本(“ZYXWVUTSRQQRSTUVWXYZ”),是在Mac OS X上创建的

第一个文件是用TextEdit创建的。只有三个流,看第一个流(用peepdf自动解码)可以清楚地显示文本

PPDF> stream 4

q Q q 72 707.272 468 12.72803 re W n /Cs1 cs 0 sc q 0.9790795 0 0 -0.9790795 72 720
cm BT 0.0001 Tc 11 0 0 -11 5 10 Tm /TT1 1 Tf (ZYXWVUTSRQQRSTUVWXYZ) Tj ET
Q Q
第二个文件是用MS Word创建的。有四个流,但解码文本在哪里都找不到。查看单词doc中的对应流不会显示解码字符串:

PPDF> stream 4

q Q q 18 40 576 734 re W n /Cs1 cs 0 0 0 sc q 0.24 0 0 0.24 90 708.72 cm BT
-0.0004 Tc 50 0 0 50 0 0 Tm /TT2 1 Tf [ (!") -1 (#) -1 ($) -1 (%&'\() -1 (\))
-1 (*) -1 (*) -1 (\)) -1 (\() -1 ('&%$) -1 (#) -1 (") -1 (!) ] TJ ET Q q 0.24 0 0 0.24 239.168 708.72
cm BT 50 0 0 50 0 0 Tm /TT2 1 Tf (+) Tj ET Q Q
我不清楚字符串在文件中的位置,也不清楚流中的信息是什么意思。有什么见解吗

我不清楚字符串在文件中的位置

通常情况下,您不会在内容流中看到明文,因为在内容流中使用的编码不需要标准编码,也不需要ASCII格式

[ (!") -1 (#) -1 ($) -1 (%&'\() -1 (\)) -1 (*) -1 (*) -1 (\)) -1 (\() -1 ('&%$) -1 (#) -1 (") -1 (!) ] TJ
该操作在其数组操作数中包含
ZYXWVUTSRQQRSTUVWXYZ
,并对某些字符对进行了一些字距调整

它看起来像是一种特殊编码,使用33(=0x21=“!”)以后的字节用于所需的第一个glyph,Z,“”用于所需的第二个glyph,Y,“#”用于第三个glyphX,等等。测试字符串不仅以这些字符开头,而且以它们结尾,上面的数组也是如此,
(!”)-1(#)
<代码>(#)1(“)-1(!)

检查所用字体的定义(TT2)。它可能(也可能不)包含帮助您解码此编码的信息

或者这条流中的信息意味着什么,有什么见解吗

要了解PDF内容流的内容,您应该阅读PDF规范的相关章节,特别是第8章图形和第9章文本

由于您的问题集中在文本内容的识别上,例如,请阅读第9.10.2节“将字符代码映射到Unicode值”:

符合要求的读者可以使用这些方法,按照给定的优先级,将字符代码映射到Unicode值。特别是带标签的PDF文件,应至少提供其中一种方法(见14.8.2.4.2,“带标签PDF中的Unicode映射”):

  • 如果字体字典包含ToUnicodeCMap(请参阅9.10.3“ToUnicode CMap”),请使用该CMap将字符代码转换为Unicode

  • 如果字体是一种简单字体,它使用预定义的编码MacRomanEncodingMacExpertEncodingWinAnScienceODing,或者其编码的差异数组仅包含取自Adobe标准拉丁字符集和nam集的字符名符号字体中的ed字符(见附录D):

    a) 根据表D.1和字体的差异数组,将字符代码映射到字符名称

    b) 在Adobe Glyph列表(参见参考书目)中查找字符名以获得相应的Unicode值

  • 如果字体是使用表118中列出的预定义CMAP之一的复合字体(Identity–H和Identity–V除外),或者其子代CIDFont使用Adobe-GB1、Adobe-CNS1、Adobe-Japan1或Adobe-Korea1字符集:

    a) 根据字体的CMap将字符代码映射到字符标识符(CID)

    b) 从其CIDSystemInfo字典中获取字体的CMap(例如Adobe和Japan1)使用的字符集合的注册表和顺序

    c) 通过将注册表和步骤(b)中获得的排序以注册表–排序–UCS2(例如Adobe–Japan1–UCS2)的格式连接起来,构造第二个CMap名称

    d) 使用步骤(c)中构造的名称获取CMap(可从ASN网站获得;请参阅参考书目)

    e) 根据步骤(d)中获得的CMap映射步骤(a)中获得的CID,生成Unicode值

注意:键入0字体,其子体CIDFonts使用Adobe-GB1、Adobe-CNS1、Adobe-Japan1或Adobe-Korea1字符集合(如CIDSystemInfo字典中所指定)应具有与合格读者支持的PDF版本相对应的补充编号。与给定PDF版本相对应的字符集列表见表3。(可以使用这些字符集的其他补充,但如果补充的编号高于支持的PDF版本对应的编号,则只有后一补充中的CID被视为标准CID。)

如果这些方法无法生成Unicode值,则无法确定字符代码所代表的内容,在这种情况下,一致性读取器可以选择自己选择的字符代码

编辑:关于评论

其中一个对象提供了一些字体信息。它是“JJOWGO+Cambria”,并将对象16引用为“字体文件”,该文件也是不可读的。我将查看手册。在网上找不到有关“JJOWGO”的任何内容

您找不到任何关于
JJOWGO
的具体信息,因为它很可能是一个随机键序列,前缀为
Cambria
,表示不是所有字体都嵌入了,而是只嵌入了一个子集。参见第9.6.4节字体子集:

PDF文档可能包括Type 1和TrueType字体的子集。描述字体子集的字体和字体描述符与普通字体的字体和字体描述符略有不同。这些差异允许一致的读者识别字体子集,并合并包含同一字体的不同子集的文档。(有关字体描述符的更多信息,请参阅9.8“字体描述符”。)

对于字体子集,字体的PostScript名称包括字体的BaseFont条目的值和字体描述符的
 <<
 /FontBBox [ -1475 -2463 2867 3117 ]
 /StemV 0
 /FontFile2 16 0 R
 /Descent -222
 /XHeight 467
 /Flags 4
 /Ascent 950
 /FontName /JJOWGO+Cambria
 /Type /FontDescriptor
 /ItalicAngle 0
 /AvgWidth 615
 /MaxWidth 2919
 /CapHeight 667
 >>
<< /FirstChar 33
/Widths [ 538 570 571 921 604 648 593 496 621 653 220 ]
/Type /Font
/BaseFont /JJOWGO+Cambria
/LastChar 43
/Subtype /TrueType
/FontDescriptor 13 0 R
/ToUnicode 14 0 R >>
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo <<
  /Registry (Adobe)
  /Ordering (UCS)
  /Supplement 0
>> def
/CMapName /Adobe-Identity-UCS def
/CMapType 2 def
1 begincodespacerange
<00><FF>
endcodespacerange
1 beginbfchar
<2b><0009 000d 0020 00a0>
endbfchar
10 beginbfrange
<21><21><005a>
<22><22><0059>
<23><23><0058>
<24><24><0057>
<25><25><0056>
<26><26><0055>
<27><27><0054>
<28><28><0053>
<29><29><0052>
<2a><2a><0051>
endbfrange
endcmap
CMapName currentdict /CMap defineresource pop
end
end