PDF:字符代码 - >字形名称 - >的NSString

时间:2012-10-09 08:05:42

标签: objective-c pdf character

在我之前的问题的跟进中,尝试使用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 metricsiOS PDF to plain text parser

1 个答案:

答案 0 :(得分:2)

我没有对此进行过测试,但在我看来,您需要使用Adobe Glyph Naming convention来实现此目的:

  

Adob​​e 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):

     
      
  1. 根据表D.1将字符代码映射到字符名称   第996页和字体的差异数组。
  2.   
  3. 在Adobe字形列表中查找字符名称(请参阅   参考书目)获取相应的Unicode值。
  4.