我终于得到某种pdf扫描仪了。它读入回调函数没有问题,但是当我尝试NSLog结果来自CGPDFScannerPopString时,我得到如下结果:
ˆ ˛˝ # ˜˜˜ #˜' ˜˜˜ "˜ '˜˜ " ' ˜˜
这里找不到任何字符串...
有什么想法可以吗? 这是我的回调函数:
static void op_Tj (CGPDFScannerRef s, void *info)
{
CGPDFStringRef string;
if (!CGPDFScannerPopString(s, &string))
return;
NSLog(@"string: %@", (__bridge NSString *)CGPDFStringCopyTextString(string));
}
谢谢!
修改:Example PDF
答案 0 :(得分:2)
您应该知道CGPDFStringRef不是ASCII字符串或类似的东西。参看http://developer.apple.com/library/mac/documentation/graphicsimaging/Reference/CGPDFString/Reference/reference.html ---它是“0到255范围内的一系列字节无符号整数值”,必须根据最新的PDF参考进行解释。
反过来,PDF参考将告诉您字节的解释取决于使用的字体,而类似ASCII的解释在欧洲语言的情况下很常见,它们不是强制性的,而在亚洲语言的情况下,字体子集嵌入非常常见,解释可能看起来是随机的。
CGPDFStringCopyTextString会尝试相应地解释这些字节,但不必将其作为常规字符串进行合理解释。
编辑检查样本PDF Ron提供的信息显示,在此示例的情况下,对象3 0中的字体编码(在文档的大多数页面上占主导地位)确实不是标准编码,但改为:
<</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
编码似乎是通过从下一个所需的字形开始处理下一个编号来创建的。这显然会导致高度个性化的编码...
据说字体对象确实包含/ Encoding条目和/ ToUnicode条目。因此,如果方法CGPDFStringCopyTextString在这里给出了对字体的引用并且真的尝试过,那么很容易就能够将这些字节正确地转换成相应的文本。它没有达到任何体面,似乎表明它根本没有用于解释字节的字体的信息---我不认为它不会尝试......
因此,为了准确提取文本,您必须使用内容流中字体的信息自行解释CGPDFStringRef中的字节。如果您不想从头开始这样做,您可能会对PDFKitten感兴趣,{{3}}是一个从iOS中的PDF中提取数据的框架。虽然它还不完美(某些字体结构可能令人困惑),但这是一个很好的起点。