带尖括号的PDF Tj命令?

时间:2014-03-31 13:23:12

标签: pdf pdf-generation

我正在尝试找出未压缩的 PDF v1.4文档中使用Times字体的位置。

PDF中描述Times字体的/Font对象是对象65,如下所示:

65 0 obj
<</Type /Font
/Subtype /TrueType
/BaseFont /PXAAAD+TimesNewRoman,Italic
/FirstChar 1
/LastChar 35
/Widths [250 333 333 333 500 500 500 500 500 500 500 500 500 500 333 722 722 833 666 610 500 556 500 443 443 500 277 443 500 389 389 277 500 443 500]
/FontDescriptor 205 0 R
/ToUnicode 206 0 R>>
endobj

它引用/FontDescriptor对象205来进一步定义Times字体对象,并引用对象/ToUnicode中的206映射,它描述了字节到unicode字符映射。 编辑:Ritsaert对以下问题的初步回答之后,我在这里添加了字体的/ToUnicode对象,以提供上述CMap

206 0 obj
<</Length 208 0 R>>
stream
/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
35 beginbfchar
<01> <0020>
<02> <0028>
<03> <0029>
<04> <002d>
<05> <0030>
<06> <0031>
<07> <0032>
...
<23> <0101>
endbfchar
endcmap
CMapName currentdict /CMap defineresource pop
end
end

endstream
endobj

我现在已经将Times字体对象的使用跟踪到一个/Page对象(其中一个),就像下面一个通过65引用字体对象/F4的对象一样参考页面/Resources

12 0 obj
<</Type /Page
/Parent 2 0 R
/MediaBox [0 0 432 648]
/Contents 92 0 R
/Resources <</Font <</F1 62 0 R
/F3 64 0 R
/F4 65 0 R>>
/ProcSet [/PDF /Text]>>
/Group <</S /Transparency
/CS /DeviceRGB>>>>
endobj

PDF文件中的/Contents流(对象92)充满了文本对象(包含在BTET中),其中没有一个包含文本,但相反,他们使用充满数字的尖括号。例如,以下是对我正在尝试查找的Times字体/F4的唯一引用:

92 0 obj
<</Length 93 0 R>>
stream
...
BT
0.5020 g
72.0000 615.1512 Td
/F4 12.0000 Tf
<0605> Tj
ET
...
endstream
endobj

但是尖括号和<0605>指的是什么?字体表中的特定字形?查看PDF reference和第5.3.2节,我找不到尖括号的提及。

编辑:鉴于上述代码和<0605>是文本的十六进制编码的已接受答案,<0605>是条目<06>和{{ 1}}在<05>对象CMap中,因此分别映射到unicodes 206<0031>。这意味着,字符串<0030>引用U + 0031(“1”)和U + 0030(“0”),这样Times字体用于页面对象{“字符串”10“ {1}}。

1 个答案:

答案 0 :(得分:7)

这里发生了什么:

  • 在内容流中,Tj命令被赋予要绘制的字符串<0605><>之间的字符串是 hex 字符串,因此会绘制字符#6和#5。在链接PDF参考的3.2.3中,解释了符号。

  • 在文本绘制命令之前,使用F4命令选择了字体Tf

  • 鉴于包含该字体的页面的资源分支被引用为对象65修订版0.该字体对象是子集化的Truetype字体,其中定义了字形1..35。未指定Encoding(因此使用WinAnsiEncoding)。因此,嵌入的子集化字体以非标准方式重新排列字体中的字符(经常发生)。

现在,如果您想知道这些字形ID如何链接到Unicode字符:字体有ToUnicode链接,其中流包含定义映射的CMAP。这应该足以将字符串转换为Unicode字符串。