首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >/Differences字典用于处理PDF中的代码解析问题

/Differences字典用于处理PDF中的代码解析问题
EN

Stack Overflow用户
提问于 2015-05-18 10:30:17
回答 2查看 1.5K关注 0票数 3

Type1字体/Differences编码在值映射中使用字符串,例如,将字符编码为“one”。它只用于数字和特殊字符。

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

如何从使用这种编码的PDF中解码字符串?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-18 13:39:49

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

代码语言:javascript
运行
复制
/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有一个文件为您定义了所有这些这里。该文件中有一个链接,它现在已经死了,但很可能它本来是要转到这里的。

票数 5
EN

Stack Overflow用户

发布于 2015-05-18 13:19:20

如何从使用这种编码的PDF中解码字符串?

正如规范所解释的那样:

9.10.2将字符代码映射到Unicode值 符合标准的读取器可以按照给定的优先级使用这些方法将字符代码映射到Unicode值。特别是附有标签的PDF文件应至少提供下列一种方法:

  • 如果字体字典包含ToUnicode CMap,请使用该CMap将字符代码转换为Unicode。
  • 如果字体是使用预定义编码之一MacRomanEncodingMacExpertEncoding,或WinAnsiEncoding,的简单字体,或者具有差异的编码,则数组只包含从Adobe标准拉丁字符集和符号字体中的一组命名字符中提取的字符名称: ( a)根据表D.1和字体的差异数组将字符代码映射到字符名。 b)在Adobe列表中查找字符名,以获得相应的Unicode值。
  • 如果字体是复合字体..。(不适用于你的情况)

如果这些方法无法生成Unicode值,则无法确定字符代码代表什么,在这种情况下,符合条件的读者可以选择他们选择的字符代码。

(ISO 32000-1)

因此,首先,您应该查找一个ToUnicode映射。

如果没有(如示例文档中的情况),则使用编码(预定义或差异)。

如果您的代码没有映射到编码中的适当内容,那么根据规范无法确定字符代码所代表的是什么!

如果所讨论的字体是嵌入的,那么您可能还可以通过解析嵌入的字体程序来解决这个问题,其中可能包括它自己到Unicode的映射。

否则,您可以从这里开始猜测(或委托OCR)。

但你的假设

它只用于数字和特殊字符。

已经错了。如果查看示例文档,例如,在文档的第一页中使用的两种字体F25F26具有一个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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30300827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档