2011-01-19 55 views
3

我正在使用石英來顯示pdf。我需要獲取搜索文本所在頁面的索引。任何人都可以幫助我?謝謝。如何使用石英搜索pdf文檔中的文本

解決方案: 有一個代碼示例從頁面中提取文本並檢查序列。

#import <Foundation/Foundation.h> 

@interface PDFSearcher : NSObject { 
    CGPDFOperatorTableRef table; 
    NSMutableString *currentData; 
} 

@property (nonatomic, retain) NSMutableString * currentData; 
-(id)init; 
-(BOOL)page:(CGPDFPageRef)inPage containsString:(NSString *)inSearchString; 

@end 

#import "PDFSearcher.h" 

@implementation PDFSearcher 
@synthesize currentData; 
void arrayCallback(CGPDFScannerRef inScanner, void *userInfo) 
{ 
    PDFSearcher * searcher = (PDFSearcher *)userInfo; 

    CGPDFArrayRef array; 

    bool success = CGPDFScannerPopArray(inScanner, &array); 

    for(size_t n = 0; n < CGPDFArrayGetCount(array); n += 2) 
    { 
     if(n >= CGPDFArrayGetCount(array)) 
      continue; 

     CGPDFStringRef string; 
     success = CGPDFArrayGetString(array, n, &string); 
     if(success) 
     { 
      NSString *data = (NSString *)CGPDFStringCopyTextString(string); 
      [searcher.currentData appendFormat:@"%@", data]; 
      [data release]; 
     } 
    } 
} 

void stringCallback(CGPDFScannerRef inScanner, void *userInfo) 
{ 
    PDFSearcher *searcher = (PDFSearcher *)userInfo; 

    CGPDFStringRef string; 

    bool success = CGPDFScannerPopString(inScanner, &string); 

    if(success) 
    { 
     NSString *data = (NSString *)CGPDFStringCopyTextString(string); 
     [searcher.currentData appendFormat:@"%@", data]; 
     [data release]; 

    } 
} 

-(id)init 
{ 
    if(self = [super init]) 
    { 
     table = CGPDFOperatorTableCreate(); 
     CGPDFOperatorTableSetCallback(table, "TJ", arrayCallback); 
     CGPDFOperatorTableSetCallback(table, "Tj", stringCallback); 
    } 
    return self; 
} 

-(BOOL)page:(CGPDFPageRef)inPage containsString:(NSString *)inSearchString 
{ 
    [self setCurrentData:[NSMutableString string]]; 
    CGPDFContentStreamRef contentStream = CGPDFContentStreamCreateWithPage(inPage); 
    CGPDFScannerRef scanner = CGPDFScannerCreate(contentStream, table, self); 
    bool ret = CGPDFScannerScan(scanner); 
    CGPDFScannerRelease(scanner); 
    CGPDFContentStreamRelease(contentStream); 
    //NSLog(@"%u, %@", [self.currentData length], self.currentData); 
    return ([[self.currentData uppercaseString] 
      rangeOfString:[inSearchString uppercaseString]].location != NSNotFound); 
} 
@end 
+0

不忘記的dealloc CGPDFOperatorTableRelease(表),或者你討厭的大泄漏。 – steipete 2011-07-21 23:06:55

回答

2

使用CGPDFDocument,CGPDFPage和CGPDFScanner掃描頁面內容並將其解析爲NSString。 然後使用NSString函數在該頁面上查找文本。如果存在,則在某個數組中存儲相應的頁碼。重複此掃描和解析for循環的頁數在PDF

0

石英內部沒有什麼可做的。 Quartz用於圖形顯示 - 它不需要知道或關心在PDF中搜索字符串匹配。您將不得不使用Core Graphics PDF解析方法來提取數據,自己搜索字符串,然後獲取它發生的頁面。

0

如果使用PDFDocument,而不是CGPDFDocument,該API具有文本搜索操作,如findString:withOptions

相關問題