PDF 文件通常对字体字形使用"correct"字符代码吗?



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

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

我的问题是:PDF cmap通常是一致的吗?换句话说,如果我在PDF中遇到字符"&",我能保证cmap总是将"&"映射到与符号吗?或者一些pdf生成软件在字符代码和字形名称之间创建自己的任意映射(这将是相当邪恶的,可能会破坏pdf中的搜索和文本选择)?

当然,我意识到cmap 有可能使用不直观的映射——我想我在问,这在现实世界中真的会发生吗?

我的具体用例是在音乐字体的世界。我正在分析PDF中的字符,以确定每个字符代表哪种音乐符号(例如,高音谱号,音符头等)。我想知道我对字体名称和字符代码的组合将始终产生相同的字形有多大的信心。例如,如果我知道字体名称是"Opus",字形是"#",那么我可以假设总是映射到高音谱号字形吗?或者我是否需要分析符号的参数以确保它实际上是一个高音谱号?

每个PDF创建者都不一样。

一个相当常见的方法(唉!)是"顺序遇到",其中文本流中的第一个字符被映射到01,下一个字符被映射到02,以此类推。因此,文本"Hello"将被编码为0102030304

我想知道我对字体名称和字符代码的组合是否总是产生相同的字形有多大的信心。

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

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

最新更新