/差异字典用于PDF中的编码解析问题

时间:2015-05-18 10:30:17

标签: pdf embedded-fonts

Type1字体/Differences编码在值的映射中使用字符串,例如1个字符被编码为' one'。它仅用于数字和特殊字符。

使用这些编码的标准方法是什么?

如何解码使用此类编码的PDF中的字符串?

文件的链接:http://www.filedropper.com/open

2 个答案:

答案 0 :(得分:4)

这是您文件中的/Differences数组(老实说,您应该刚刚发布了这个,而不是链接下载页面):

/Differences [
    24 /breve/caron/circumflex/dotaccent/hungarumlaut/ogonek/ring/tilde
    39 /quotesingle
    96 /grave
    128 /bullet/dagger/daggerdbl/ellipsis...
]

这种方式的工作方式是字体也有与之关联的编码(例如/MacRoman/WinANSI)。在Type 1字体的情况下,字体中内置了编码。然后给出该编码的副本,您将差异应用于它。从数字开头(您的第一个是24),您将条目24-31更改为/breve/circumflex,依此类推。

在Type 1字体中,有一个名为/CharStrings的字典,它是字形名称与将呈现它的数据/代码的关联。例如,如果你得到一个代码为26的字符,你可以在你的编码数组中找到它(对于Type 1字体应该是一个256元素的数组),并且应用了差异,你得到了名字/circumflex。然后在CharStrings字典中查找,拉出字形数据并进行渲染。编码中不存在的任何字符都应设置为/.notdef,然后呈现表示未定义字符的形状(通常为空框)。

现在可能你的问题是,如何将这些字形名称转换为更有用的字样,比如说Unicode?

如果查看附录D,您将看到一组表格,用于定义标准拉丁语编码的字符集。您将创建一个将Adobe标准名称映射到Unicode的查找表。不幸的是,附件D中的表格不完整。幸运的是,Adobe有一个文件可以为您here定义所有这些内容。该文件中有一个链接,现在已经死了,但最有可能是here

答案 1 :(得分:3)

  

如何解码使用此类编码的PDF中的字符串?

正如规范解释:

  

9.10.2将字符代码映射到Unicode值

     

符合本标准的读者可以在给定的优先级中使用这些方法将字符代码映射到Unicode值。特别是标记的PDF文档应至少提供以下方法之一:

     
      
  • 如果字体字典包含 ToUnicode CMap,请使用该CMap将字符代码转换为Unicode。

  •   
  • 如果字体是使用预定义编码 MacRomanEncoding MacExpertEncoding WinAnsiEncoding 之一的简单字体,或者有一个编码,差异数组只包含取自Adobe标准拉丁字符集的字符名称和符号字体中的命名字符集:

         

    a)根据表D.1和字体的差异数组将字符代码映射到字符名称。

         

    b)在Adobe Glyph List中查找字符名称以获取相应的Unicode值。

  •   
  • 如果字体是复合字体... (在您的情况下不适用)

  •   
     

如果这些方法无法生成Unicode值,则无法确定字符代码表示的内容,在这种情况下,符合本标准的读者可以选择自己选择的字符代码。

     

(ISO 32000-1)

因此,首先,您应该寻找 ToUnicode 地图。

如果没有(如您的样本文档),请使用编码(预定义或差异)。

如果您的代码未映射到编码中的某些内容,那么根据规范无法确定字符代码代表什么

如果有问题的字体是嵌入式的,你可能还可以通过解析嵌入式字体程序来解决问题,嵌入式字体程序可能包含自己的Unicode映射。

否则,这是您可以开始猜测(或委托给OCR)的地方。

但是你的假设

  

仅用于数字和特殊字符。

已经错了。如果您查看示例文档,例如在文档的第一页上使用的两种字体 F25 F26 有一个差异数组,如下所示:

  

0   /.notdef   1   / dotaccent   / FI   / FL   /分数   / hungarumlaut   / Lslash   / lslash   /反尾形符   /环   10   /.notdef   11   /短音   /减去   13   /.notdef   14   / Zcaron   / zcaron   /卡隆   / dotlessi   / dotlessj   / FF   / FFI   / ffl第   22   /.notdef   三十   /坟墓   / quotesingle   /空间   / exclam   / quotedbl   / numbersign   /美元   /百分   /符号   / quoteright   / parenleft   / parenright   /星号   /加   /逗号   /连字符   /期   /削减   /零   /一   /二   /三   / A四款   /五   /六   /七   /八   /九   /结肠   /分号   /减   /等于   /大   /题   /在   /一个   / B   /C   / d   / E   /F   /G   /H   /一世   / J   / K   / L   / M   / N   / O   / P   / Q   / R   / S   / T   / U   / V   / W   /X   / Y   / Z   / bracketleft   /反斜线   / bracketright   / asciicircum   /下划线   / quoteleft   /一个   / b   /C   / d   / E   /F   /G   /H   /一世   / J   / K   /升   /米   / N   / O   / p   / q   / R   /秒   /吨   / U   / v   / W   /X   / Y   / Z   / braceleft   /酒吧   / braceright   / asciitilde   127   /.notdef   130   / quotesinglbase   /弗洛林   / quotedblbase   /省略   /匕首   / daggerdbl   /抑扬   /个千   / Scaron   / guilsinglleft   / OE   141   /.notdef   147   / quotedblleft   / quotedblright   /子弹   / endash   / emdash   /波浪   /商标   / scaron   / guilsinglright   / OE   157   /.notdef   159   / Ydieresis   160   /.notdef   161   / exclamdown   /分   /英镑   /货币   /日元   / brokenbar   /部分   /分音符   /版权   / ordfeminine   / guillemotleft   / logicalnot   /连字符   /注册   /长音符号   /学位   /正负   / twosuperior   / threesuperior   /急性   /亩   /段   / periodcentered   /加符   / onesuperior   / ordmasculine   / guillemotright   /四分之一   /一半   /四分之三   / questiondown   / Agrave   / Aacute   / Acircumflex   / Atilde   / Adieresis   /戒指   / AE   / Ccedilla   / Egrave   / Eacute   / Ecircumflex   / Edieresis   / Igrave   / Iacute   / Icircumflex   / Idieresis   / ETH   / Ntilde   / Ograve   / Oacute   / Ocircumflex   / Otilde   / Odieresis   /乘   / Oslash   / Ugrave   / Uacute   / Ucircumflex   / Udieresis   / Yacute   /刺   / germandbls   / agrave   / aacute   / acircumflex   / atilde   / adieresis   /戒指   / AE   / ccedilla   / egrave   / eacute   / ecircumflex   / edieresis   / igrave   / iacute   / icircumflex   / idieresis   / ETH   / ntilde   / ograve   / oacute   / ocircumflex   / otilde   / odieresis   /划分   / oslash   / ugrave   / uacute   / ucircumflex   / udieresis   / yacute   /刺   / ydieresis

包含正常大写 / A .. / Z 和小写 / a .. / z 角色也是。

顺便说一下,

  

Type1字体/差异编码在值的映射中使用字符串,例如1个字符被编码为' one'。

不完全正确,' / '字符是相应映射值的一部分,例如, / one ,作为PDF对象,这些不是字符串,而是名称