我正在尝试找出未压缩的 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
)充满了文本对象(包含在BT
和ET
中),其中没有一个包含文本,但相反,他们使用充满数字的尖括号。例如,以下是对我正在尝试查找的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}}。
答案 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字符串。