【问题标题】:pdf tounicode maps cid to incorrect characterpdf tounicode 将 cid 映射到不正确的字符
【发布时间】:2020-04-22 14:30:19
【问题描述】:

我正在尝试使用非常奇怪的 ToUnicode CMap 解析 PDF 文件。它将 CID 映射为错误的 unicode,但在 Mac 或 Acrobat 上的 Preview 可以正确显示。

这是页面对象:

7 0 obj
<<
  /Type /Page
  /Parent 1 0 R
  /MediaBox [ 0 0 595.5 842.25 ]
  /Group <<
    /Type /Group
    /S /Transparency
    /CS /DeviceRGB
  >>
  /Resources <<
    /Font <<
      /F0 4 0 R
      /F1 5 0 R
      /F2 6 0 R
    >>
    /XObject <<
      /Im0 2 0 R
    >>
    /ProcSet [ /PDF /Text /ImageC ]
  >>
  /Contents 3 0 R
>>
endobj

这是 Contents 对象的摘录,内容类似于 Client Name::

3 0 obj
<<
  /Length 2490
  /Filter /FlateDecode
>>
stream
q
294.80 0 0 45.35 40.19 768.05 cm
/Im0 Do
Q
q
39.44 665.25 106.38 15.67 re
W
n
/F0 11 Tf
0.00 0.00 0.00 rg
BT
41.69 538.82 Td
<0012016F015D011E0176019A0003004501020175011E0357> Tj
ET
...

这是字体 /F0 对象:

4 0 obj
<<
  /Type /Font
  /Subtype /Type0
  /BaseFont /Calibri
  /Encoding /Identity-H
  /DescendantFonts [ 12 0 R ]
  /ToUnicode 10 0 R
>>
endobj

而且,这是 Font /F0 对象的 ToUnicode 对象的摘录:

10 0 obj
<<
  /Length 584
  /Filter /FlateDecode
>>
stream
/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo
<< /Registry (Adobe)
/Ordering (UCS)
/Ordering (Identity)
/Supplement 0
>> def
/CMapName /Calibri def
/CMapType 2 def
1 begincodespacerange
<0000> <FFFF>
endcodespacerange
67 beginbfchar
<0012> <0043>
<016F> <006C>
<015D> <0001>
<011E> <0065>
<0176> <0001>
<019A> <0074>
<0003> <0020>
<0045> <004E>
<0102> <0061>
<0175> <0001>
<0357> <003A>
...

有了这个ToUnicode CMap,上面文字中的字符变成了Cl\x01e\x01t Na\x01e:,嵌入了一堆\x01,其余的都是正常的。但是,在 Acrobat 中,此文本显示正确。

Acrobat 如何正确解析文本?我该怎么做才能以 unicode 检索正确的文本?谢谢。

【问题讨论】:

  • “但是,在 Acrobat 中,此文本显示正确。” - 您的意思是 Acrobat 显示 正确的字形还是 从中复制和粘贴会返回正确的 unicode 字符吗?

标签: pdf unicode pdf-generation


【解决方案1】:

文本的呈现完全独立于 ToUnicode CMap。 ToUnicode Cmap 用于获取字符代码并返回相应的 Unicode 代码点。

文本的渲染是通过采用相同的字符代码并根据字体类型通过各种方法映射它来完成的。在您的情况下,这是一个带有 Identity-H CMap 的 CIDFont,因此字符代码直接映射到 CID,并且(假设后代字体是 TrueType 字体)映射到 TrueType GID。

然后使用 GID 检索字符轮廓并渲染字形。 ToUnicode 根本不用于呈现文本,它仅用于复制/粘贴/搜索。

尝试从 Acrobat 复制/粘贴文本,我相信这将证明您在上面提到的相同问题。

恐怕如果 ToUnicode CMap 错误,则没有可靠的方法来检索文本。您可以遵循一些启发式方法,在这种情况下,CIDFont 使用 Identity-H CMap 的事实意味着您可以“可能”使用嵌入在 TrueType 字体中的 CMAP 子表来为您提供 Unicode 值。但总的来说,没有真正的方法可以判断 ToUnicode CMap 是否不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2012-01-23
    • 2021-08-23
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多