我正在使用石英来显示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 :(得分:2)
使用CGPDFDocument,CGPDFPage和CGPDFScanner扫描并将页面内容解析为NSString。 然后使用NSString函数查找该页面上的文本。如果存在,则将相应的pagenumber存储在某个数组中。重复此扫描并解析pdf
中的页数for循环答案 1 :(得分:1)
http://www.random-ideas.net/posts/42%22
查看以上链接的工作情况。
答案 2 :(得分:0)
Quartz内部没有任何事情可做。 Quartz用于图形显示 - 它不需要知道或关心在PDF中搜索字符串匹配。您将不得不使用Core Graphics PDF解析方法来提取数据,自己搜索字符串,然后获取它出现的页面。
答案 3 :(得分:0)
如果您使用PDFDocument
而不是CGPDFDocument
,该API会进行文字搜索操作,例如findString:withOptions