4

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

4

1 回答 1

2

我没有对此进行测试,但在我看来,您需要为此使用Adob​​e Glyph 命名约定

Adobe 字形命名约定的目的是支持从字形序列计算 Unicode 字符串。这是通过指定从字形名称到字符串的映射来实现的。

该页面上链接的glyphlist.txt似乎与您的问题相关。
示例片段:

...
epsilon;03B5
epsilontonos;03AD
equal;003D
equalmonospace;FF1D
equalsmall;FE66
equalsuperior;207C
...

然后您需要做的就是将这些 un​​icode 值放入您的 NSString 实例中。

编辑:确认上面提供的信息,我在Adob​​e 的 PDF 参考文档中
找到了以下解释,第 5.9 节 - 文本内容的提取

如果字体是使用预定义编码 MacRomanEncoding、MacExpertEncoding 或 WinAnsiEncoding 之一的简单字体,或者其差异数组仅包含取自 Adob​​e 标准拉丁字符集的字符名称和符号中的命名字符集的编码字体(见附录 D):

  1. 根据第 996 页上的表 D.1 和字体的差异数组,将字符代码映射到字符名称。
  2. 在 Adob​​e Glyph List(参见参考书目)中查找字符名称以获得相应的 Unicode 值。
于 2012-10-15T14:07:33.527 回答