Type1字体/Differences编码在值映射中使用字符串,例如,将字符编码为“one”。它只用于数字和特殊字符。
使用这些编码的标准方法是什么?
如何从使用这种编码的PDF中解码字符串?
文件链接:http://www.filedropper.com/open
发布于 2015-05-18 13:39:49
下面是您的文件中的/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有一个文件为您定义了所有这些这里。该文件中有一个链接,它现在已经死了,但很可能它本来是要转到这里的。
发布于 2015-05-18 13:19:20
如何从使用这种编码的PDF中解码字符串?
正如规范所解释的那样:
9.10.2将字符代码映射到Unicode值 符合标准的读取器可以按照给定的优先级使用这些方法将字符代码映射到Unicode值。特别是附有标签的PDF文件应至少提供下列一种方法:
如果这些方法无法生成Unicode值,则无法确定字符代码代表什么,在这种情况下,符合条件的读者可以选择他们选择的字符代码。
(ISO 32000-1)
因此,首先,您应该查找一个ToUnicode映射。
如果没有(如示例文档中的情况),则使用编码(预定义或差异)。
如果您的代码没有映射到编码中的适当内容,那么根据规范无法确定字符代码所代表的是什么!
如果所讨论的字体是嵌入的,那么您可能还可以通过解析嵌入的字体程序来解决这个问题,其中可能包括它自己到Unicode的映射。
否则,您可以从这里开始猜测(或委托OCR)。
但你的假设
它只用于数字和特殊字符。
已经错了。如果查看示例文档,例如,在文档的第一页中使用的两种字体F25和F26具有一个Difference数组,如下所示:
0 /.notdef 1 /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash /ogonek /ring 10 /.notdef 11 /breve /minus 13 /.notdef 14 /zcaron /Zcaron /.notdef en32 20 en22 en24 en26 en29 en31/圆括号: /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /seven /nine /seven/eight/seven/nine/seven/nine/seven/eight/seven/seven/eight/seven/nine/seven/seven/nine/en38 19 en38P /q /r /s /t /u /v /w /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /underscore/asciicircum en20 en22 en24 en26 en28 en29 en32 en34 en36 en38#/X /y /z /braceleft /bar /braceright /asciitilde 127 /quotesinglbase /florin /quotedblbase /ellipsis /daggerdbl /circumflex /perthousand /Scaron /scaron 141-147 en30 20 en23 en25 en27 157 159 160 en32#/cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /hyphen /registered /macron /degree /plusminus /degree/registered/macron/registered/macron/degree/registered/macron/registered/macron/degree/macron en20 en22 en25 en27 en29 en31 en34 en36 en37 en39/ecircumflex /Edieresis /igrave /iacute /icircumflex /Idieresis /Eth /ntilde /Ograve /Oacute /Otilde /Odieresis /multiply /Oslash /Ugrave /Oslash/Odieresis/multiply/Odieresis/multiply/Oslash/Odieresis/multiply/Odieresis/multiply/Oslash/multiply en20 en22 en25 en27 en29 en31 en34 en36 en37 en39/ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis
它也包含普通大写/A../Z和小写/a../z字符的映射。
顺便说一下,
Type1字体/Differences编码在值映射中使用字符串,例如,将字符编码为“one”。
严格地说,'/‘字符是各自映射值的一部分,例如/one,而作为PDF对象,这些字符不是Strings,而是Names。
https://stackoverflow.com/questions/30300827
复制相似问题