I use quartz to display pdf. I need to get the indexes of the pages where my search text exists. Can anybody help me? Thanks.
Solution: There is sample code that extracts text from a page and checks it for consistency.
#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
source share