在我之前的问题的跟进中,尝试使用CGPDF *函数从PDF文件中提取文本,具有:
CGPDFStringRef pdfString
我发现它可以转换为如下字符代码数组:
const unsigned char *characterCodes = CGPDFStringGetBytePtr(pdfString);
现在,我试图提取的文本是用14种类型1基本字体之一编写的,它不在PDF本身中编码。为此,我解析了该字体的相关AFM文件,给我一个从字符代码到字形名称的映射,它的尺寸如下:
C 61 ; WX 600 ; N equal ; B 80 138 520 376 ;
C 63 ; WX 600 ; N question ; B 129 -15 492 572 ;
C 64 ; WX 600 ; N at ; B 77 -15 533 622 ;
C 65 ; WX 600 ; N A ; B 3 0 597 562 ;
C 66 ; WX 600 ; N B ; B 43 0 559 562 ;
我的问题是,知道字符代码,说:“61”我如何从它的字形名称:“等于”到 NSString @ “=”。 特别是当该字符代码被重新映射到其他字形名称时,比如说,例如:“问题”由PDF的字体编码选项。
之前的问题: iOS PDF parsing Type 1 Fonts metrics和 iOS PDF to plain text parser
答案 0 :(得分:2)
我没有对此进行过测试,但在我看来,您需要使用Adobe Glyph Naming convention来实现此目的:
Adobe Glyph Naming约定的目的是支持 从一系列字形计算Unicode字符串。 这是通过指定从字形名称到字符的映射来实现的 字符串。
该页面上链接的glyphlist.txt似乎与您的问题相关 样本片段:
...
epsilon; 03B5
epsilontonos; 03AD
相等; 003D
等平衡; FF1D
等于小; FE66
等于; 207C
...
然后您需要做的就是putting those unicode values in your NSString instance。
修改强>
确认上面提供的信息后,我在PDF Reference Document from Adobe,第5.9节 - 文本内容的提取中找到了以下解释:
如果字体是使用预定义编码之一的简单字体 MacRomanEncoding,MacExpertEncoding或WinAnsiEncoding,或者有 一种编码,其差异数组仅包含字符名称 取自Adobe标准拉丁字符集和命名集 符号字体中的字符(见附录D):
- 根据表D.1将字符代码映射到字符名称 第996页和字体的差异数组。
- 在Adobe字形列表中查找字符名称(请参阅 参考书目)获取相应的Unicode值。
醇>