假设我有一个包含一个或多个嵌入字体的PDF文件。以下是我对如何呈现单个文本字符的理解:
这是我的问题:PDF cmap一般是否一致?换句话说,如果我遇到角色“&”在PDF中,我可以放心,cmap将始终映射“&”到了&符号吗?或者一些PDF生成软件是否在字符代码和字形名称之间创建了自己的任意映射(这可能是相当邪恶的,可能会破坏PDF搜索和文本选择)?
当然我意识到cmap的可能使用非直观的映射 - 我想我想问,这真的发生在真实世界吗?
我的具体用例是音乐字体世界。我正在分析PDF中的字符以确定每个人代表哪个音乐字形(例如,高音谱号,音符等)。我想知道我是多么自信,字体名称和字符代码的组合将始终产生相同的字形。例如,如果我知道字体名称是“Opus”而字形是“#”,我可以假设将总是映射到高音谱号字形吗?或者我是否必须分析字形的指标以确保它实际上是一个高音谱号?
答案 0 :(得分:3)
它与一个PDF创建者不同。
一个相当常见的方法(唉!)是"订单遇到",其中文本流中的第一个字符映射到\001
,\002
旁边的字符等等。因此,文字"Hello"
将被编码为\001\002\003\003\004
。
我想知道我有多么自信,字体名称和字符代码的组合将始终产生相同的字形。
在单个PDF文档中,如果在不同的上下文中使用相同的字体对象,则确实如此 - 映射是在字体对象内定义的。如果您遇到另一个使用相同字体的字体对象,但它指向另一个字体流(即字体子集嵌入两次),那么它可能不为真。每个子集可能都有自己的编码。
仅当字体对象包含/ToUnicode
映射时,您才能确信值映射到正确的字符。