使用peepdf我正在分析两个简单的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创建的。有四个流,但解码后的文本无处可寻。查看Word文档中的相应流不会显示已解码的字符串:
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
对于我来说,字符串在文件中的位置或此流中的信息意味着什么并不明显。任何见解?
答案 0 :(得分:0)
来自@mkl的评论清楚地说明了发生了什么。 MS Word生成的pdf中的文本使用的是字符映射。
我通过搜索带有ToUnicode条目的对象来跟踪字体字典:
<< /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 >>
ToUnicode条目引用了对象14,所以我看了下一个:
/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
ISO 32000-1的第9.10.3节解释了beginbfrange如何将字符范围相互映射。字符代码范围映射到Unicode值。 “范围”21-21包含单个字符,即“!”。它映射到U + 005a(“Z”)。映射包含测试文档中每个字符的一行,从Z到Q.(!to *)