CGPDFScannerPopString返回奇怪结果



我终于得到了某种pdf扫描仪。它读取回调函数没有问题,但当我尝试NSLog从CGPDFScannerPopString的结果,我得到这样的结果:

ˆ ˛˝     #    ˜˜˜      #˜'  ˜˜˜      "˜   '˜˜      " '   ˜˜

这里找不到字符串…

有什么想法吗?这是我的回调函数:

static void op_Tj (CGPDFScannerRef s, void *info)
{
    CGPDFStringRef string;
    if (!CGPDFScannerPopString(s, &string))
        return;
    NSLog(@"string: %@", (__bridge NSString *)CGPDFStringCopyTextString(string));
}

谢谢了!

编辑:示例PDF

您应该意识到CGPDFStringRef根本不是ASCII字符串或类似的东西。Cf. http://developer.apple.com/library/mac/documentation/graphicsimaging/Reference/CGPDFString/Reference/reference.html——它是"一系列字节-无符号整数值,范围在0到255之间",必须根据最新的PDF引用进行解释。

PDF参考资料反过来会告诉您,字节的解释取决于所使用的字体,虽然类似ascii的解释在欧洲语言中很常见,但它们不是强制性的,而在字体子集嵌入非常常见的亚洲语言中,解释可能看起来是随机的。

CGPDFStringCopyTextString尝试相应地解释这些字节,但不必像常规字符串那样有一个合理的解释。

EDIT对Ron提供的PDF样本的检查表明,在这个样本的情况下,对象30中字体的编码(在文档的大多数页面上占主导地位)不是标准编码,而是:

<</Type/Encoding
  /Differences[0/.notdef/C/O/V/E/R/space/slash/H/L/F/underscore/W/B/five/eight/four
                /zero/two/six/D/one/period/three/Z/I/N/G/U/S/T/colon/seven/A/M/P/Y
                /plus/nine/X/hyphen/i/s/p/a/t/c/h/n/f/o/K/greater/equal/l/m/y/J/Q
                /parenleft/parenright/comma/dollar/ampersand/d/r/v/b/e/u/w/k/g/x/bar
                /quotesingle/asterisk/q/question/percent]
>>

看第一页文档的顶部

COVER / HLF_CWEB_58408485 / 58408485 / 26DEC12 10.30.22Z

BRIEFING INCLUDES FOLLOWING FLIGHTS:
26DEC12 OR0337 EHAM0630 MUVR1710 PHOYE VSM+2/8 179
NEXT FLIGHTS OF AIRCRAFT:
26DEC12 OR0338 MUVR1830 MMUN1940 PHOYE VSM+2/8 213
26DEC12 OR0338 MMUN2105 EHAM0655 PHOYE GPT+2/7 263
27DEC12 OR0365 EHAM0900 TNCB1930 PHOYE BAH+1/8 272
27DEC12 OR0366 TNCB2030 TNCC2110 PHOYE BAH+1/8 250
27DEC12 OR0366 TNCC2250 EHAM0835 PHOYE ASD+1/8 199 

编码似乎是通过从1开始为下一个所需的字形处理下一个数字而创建的。这显然导致了高度个性化的编码…

也就是说,font对象确实包括/Encoding条目和/ToUnicode条目。因此,如果方法CGPDFStringCopyTextString在这里被赋予了对字体的引用并进行了真正的尝试,它将很容易正确地将这些字节转换为相应的文本。它没有实现任何像样的东西,似乎表明它根本没有解释字节的字体的信息——我不认为它没有尝试…

因此,为了准确地提取文本,您必须使用内容流中的字体信息自己解释CGPDFStringRef中的字节。如果你不想从头开始,你可能会对PDFKitten感兴趣,这是一个在iOS中从pdf中提取数据的框架。虽然它还不完美(一些字体结构可能会阻碍它),但它是一个很好的起点。

最新更新