【问题标题】:PDF Tj command with angle brackets?带尖括号的PDF Tj命令?
【发布时间】:2014-03-31 13:23:12
【问题描述】:

我正在尝试找出在 未压缩 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 字体对象,并引用对象206 中描述字节到Unicode 字符映射的/ToUnicode 映射。 编辑: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 对象(众多对象之一),如下面的对象,它通过其页面中的 /F4 引用 @987654336 引用字体对象 65 @:

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

/Contents 流(PDF 文件中的对象 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

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

编辑:鉴于上述代码和&lt;0605&gt; 是文本的十六进制编码的公认答案,&lt;0605&gt;&lt;06&gt;&lt;05&gt; 中的条目CMap对象206,因此分别映射到Unicode &lt;0031&gt;&lt;0030&gt;。这意味着,字符串 &lt;0605&gt; 指的是 U+0031(一个“1”)和 U+0030(一个“0”),因此 Times 字体用于页面对象 12 上的字符串“10” .

【问题讨论】:

  • 然后/Contents 流充满了文本对象(包含在BTET 中),它们都不包含文本,而是使用充满数字的尖括号。 - 正如@Ritsaert 已经解释的那样,尖括号中的数字字符串,只是碰巧以十六进制形式编写。
  • @mkl:总结了问题和答案:)

标签: pdf pdf-generation


【解决方案1】:

这里发生了什么:

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

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

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

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

【讨论】:

  • 其实我不认为你关于 WinAnsiEncoding 的评论是正确的。从 PDF 规范中谈到 TrueType 字体的字体字典中 /Encoding 的值时:“用于显示不使用 MacRomanEncoding 或 WinAnsiEncoding 的字形的字体不应指定 Encoding 条目”。这本身很奇怪,因为键在字体字典的原始描述中被描述为“必需”。我猜该字体确实使用了完全专有的编码,因此它也应该在字体描述符中设置符号位。字体不是很酷吗? :)
  • @David:对于 type1 字体,默认是 StandardEncoding,对于 TT 字体是 WinAnsiEncoding。 PDf 文件中的字体通常是一团糟,你需要很多技巧/假设和正确的月相才能正确渲染这些字体(我构建了一个 PDF 渲染器,这部分是最糟糕的)。如果将其指定为符号字体,则编码应为 1on1,如您所述。几乎所有的 PDF 都包含错误(无效条目、无效名称、名称而不是字符串,反之亦然。PDF 阅读器是真正的野兽,它们可以解析的废话数量……
  • 我还编写了(部分)PDF 渲染器 :-) 但我想我逃脱了大部分字体内容;所以你是说虽然 PDF 规范可能规定 TrueType 字体需要编码,但实际上在现场没有正确遵循?还是我错过了定义此默认值的 PDF 规范的一部分?这实际上很有趣(我猜这说明了我的一些事情:))
  • @RitsaertHornstra:我已经编辑了问题以添加提到的CMap。如果我理解正确,&lt;0605&gt;CMap 对象中的条目 &lt;06&gt;&lt;05&gt;,它们分别映射到 &lt;0031&gt;&lt;0030&gt;。这意味着,它们指的是 U+0031(一个“1”)和 U+0030(一个“0”)。那是对的吗?如果是,那么 Times 字体用于渲染字符串“10”?
  • @Jens:你猜对了!请注意,ToUnicode CMAP 仅适用于文本处理应用程序,与渲染无关。因此,如果 CMAP 正确,则 PDF 内容会将 10 写入渲染目标。
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2011-09-28
  • 2019-05-01
  • 2010-09-20
  • 2012-03-22
  • 1970-01-01
相关资源
最近更新 更多