PDF文件通常使用"更正"字体字形的字符代码?

时间:2014-08-06 05:19:54

标签: pdf fonts

假设我有一个包含一个或多个嵌入字体的PDF文件。以下是我对如何呈现单个文本字符的理解:

  • 首先,确定角色使用的字体。
  • 使用嵌入在PDF中的字体“cmap”来确定给定字符的字体字形名称。例如,角色'&'在PDF文本中可能会映射到字体内部称为“&符号”的字形。
  • 使用字体的“glyf”表来确定字形名称的边界框/绘图说明。

这是我的问题:PDF cmap一般是否一致?换句话说,如果我遇到角色“&”在PDF中,我可以放心,cmap将始终映射“&”到了&符号吗?或者一些PDF生成软件是否在字符代码和字形名称之间创建了自己的任意映射(这可能是相当邪恶的,可能会破坏PDF搜索和文本选择)?

当然我意识到cmap的可能使用非直观的映射 - 我想我想问,这真的发生在真实世界吗?

我的具体用例是音乐字体世界。我正在分析PDF中的字符以确定每个人代表哪个音乐字形(例如,高音谱号,音符等)。我想知道我是多么自信,字体名称和字符代码的组合将始终产生相同的字形。例如,如果我知道字体名称是“Opus”而字形是“#”,我可以假设将总是映射到高音谱号字形吗?或者我是否必须分析字形的指标以确保它实际上是一个高音谱号?

1 个答案:

答案 0 :(得分:3)

它与一个PDF创建者不同。

一个相当常见的方法(唉!)是"订单遇到",其中文本流中的第一个字符映射到\001\002旁边的字符等等。因此,文字"Hello"将被编码为\001\002\003\003\004

  

我想知道我有多么自信,字体名称和字符代码的组合将始终产生相同的字形。

在单个PDF文档中,如果在不同的上下文中使用相同的字体对象,则确实如此 - 映射是在字体对象内定义的。如果您遇到另一个使用相同字体的字体对象,但它指向另一个字体流(即字体子集嵌入两次),那么它可能为真。每个子集可能都有自己的编码。

仅当字体对象包含/ToUnicode映射时,您才能确信值映射到正确的字符。