Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何使用quartz搜索pdf文档中的文本_Iphone_Objective C_Pdf_Quartz 2d - Fatal编程技术网

Iphone 如何使用quartz搜索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

我用石英显示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
#导入
@接口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(表),否则会出现严重的漏洞。该链接似乎已过时。。。。你能把它更新成一个工作链接吗。。。