【问题标题】:CGPDFScannerPopString returning strange resultCGPDFScannerPopString 返回奇怪的结果
【发布时间】:2012-12-09 12:51:12
【问题描述】:

我终于可以使用某种 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

【问题讨论】:

    标签: iphone ios pdf cgpdf


    【解决方案1】:

    您应该知道 CGPDFStringRef 根本不是 ASCII 字符串或类似的东西。参照。 http://developer.apple.com/library/mac/documentation/graphicsimaging/Reference/CGPDFString/Reference/reference.html --- 它是“一系列字节——0 到 255 范围内的无符号整数值”,必须根据最新的 PDF 参考进行解释。

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

    CGPDFStringCopyTextString 尝试相应地解释这些字节,但不必将其解释为常规字符串。

    编辑对 Ron 提供的样本 PDF 的检查表明,在这个样本的情况下,对象 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 感兴趣,这是一个在 iOS 中从 PDF 中提取数据的框架。虽然它还不完美(某些字体结构可能会令它感到困惑),但它是一个很好的起点。

    【讨论】:

    • 啊哈,现在更有意义了...我搜索了一些并读到文档中应该有一个 ToUnicode 条目。有,但也许你可以帮我看看如何使用它?
    • 没关系,FastPDFKit 甚至无法提取文本。不要以为我能做到……
    • 我试图阅读的 PDF 是一种私人公司信息。我会看看能不能过滤掉一些东西并发布这个......也许你可以看看它。
    • 我在我的帖子中添加了一个示例......也许你可以看看它,看看你们中的一个人是否可以从中提取数据。
    • @Ron 我查看了您提供的 PDF 并相应地编辑了我的答案。简而言之:其中使用的主要编码确实非常个人主义,但在字体对象中很好地描述了它。因此,CGPDFStringCopyTextString 方法似乎不足以完成文本提取工作。你可能想看看PDFKitten
    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多