Iphone 如何使用quartz搜索pdf文档中的文本
我用石英显示pdf。我需要获取搜索文本所在页面的索引。有人能帮我吗?谢谢 解决方案: 有一个代码示例,用于从页面中提取文本并检查序列Iphone 如何使用quartz搜索pdf文档中的文本,iphone,objective-c,pdf,quartz-2d,Iphone,Objective C,Pdf,Quartz 2d,我用石英显示pdf。我需要获取搜索文本所在页面的索引。有人能帮我吗?谢谢 解决方案: 有一个代码示例,用于从页面中提取文本并检查序列 #import <Foundation/Foundation.h> @interface PDFSearcher : NSObject { CGPDFOperatorTableRef table; NSMutableString *currentData; } @property (nonatomic, retain) NSMuta
#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
#导入
@接口PDFSearcher:NSObject{
CGPDFOOperatorTableRef表;
NSMutableString*当前数据;
}
@属性(非原子,保留)NSMutableString*currentData;
-(id)init;
-(BOOL)page:(cgpdftageref)inPage包含字符串:(NSString*)inSearchString;
@结束
#导入“PDFSearcher.h”
@实现PDF搜索器
@综合当前数据;
void arrayCallback(CGPDFScannerRef inScanner,void*userInfo)
{
PDFSearcher*搜索器=(PDFSearcher*)用户信息;
CGPDFArrayRef阵列;
bool success=cgpdfscannerparray(扫描程序和阵列);
对于(大小n=0;n=CGPDFArrayGetCount(数组))
继续;
CGPDFStringRef字符串;
success=CGPDFArrayGetString(数组、n和字符串);
如果(成功)
{
NSString*数据=(NSString*)CGPDFStringCopyTextString(字符串);
[searcher.currentData附录格式:@“%@”,数据];
[数据发布];
}
}
}
void stringCallback(CGPDFScannerRef inScanner,void*userInfo)
{
PDFSearcher*搜索器=(PDFSearcher*)用户信息;
CGPDFStringRef字符串;
bool success=cgpdfscannerpostring(inScanner和string);
如果(成功)
{
NSString*数据=(NSString*)CGPDFStringCopyTextString(字符串);
[searcher.currentData附录格式:@“%@”,数据];
[数据发布];
}
}
-(id)init
{
if(self=[super init])
{
table=cgpdfoperatablecreate();
CGPDFOOperatorTableSetCallback(表“TJ”,arrayCallback);
CGPDFOOperatorTableSetCallback(表“Tj”,stringCallback);
}
回归自我;
}
-(BOOL)页面:(cgpdftageref)inPage包含字符串:(NSString*)inSearchString
{
[self-setCurrentData:[NSMutableString]];
CGPDFContentStreamRef contentStream=CGPDFContentStreamCreateWithPage(inPage);
CGPDFScannerRef scanner=CGPDFScannerCreate(contentStream,table,self);
bool-ret=CGPDFScannerScan(扫描仪);
CGPDFScannerRelease(扫描仪);
CGPDFContentStreamRelease(contentStream);
//NSLog(@“%u,%@,[self.currentData length],self.currentData);
返回([[self.currentData大写字符串]
rangeOfString:[inSearchString uppercaseString]]。位置!=NSNotFound);
}
@结束
石英内部没有什么可以做的。Quartz用于图形显示——它不需要知道或关心搜索PDF中的字符串匹配。您必须使用核心图形PDF解析方法提取数据,自己搜索字符串,然后获取出现该字符串的页面。使用CGPDFDocument、CGPDFPage和CGPDFScanner将页面内容扫描并解析为NSString。
然后使用NSString函数查找该页面上的文本。如果存在,则将相应的页码存储在某个数组中。在for循环中对pdf中的页数重复此扫描和解析
查看上面的链接。如果使用
PDFDocument
,而不是CGPDFDocument
,则该API具有文本搜索操作,例如findString:withOptions
不要忘记dealloc中的cgpdfofoperatablerelease(表),否则会出现严重的漏洞。该链接似乎已过时。。。。你能把它更新成一个工作链接吗。。。