Как искать текст в PDF документе с кварцем - PullRequest
3 голосов
/ 19 января 2011

Я использую кварц для отображения 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

Ответы [ 4 ]

2 голосов
/ 19 января 2011

Используйте CGPDFDocument, CGPDFPage и CGPDFScanner для сканирования и анализа содержимого страницы в NSString. Затем используйте функцию NSString, чтобы найти текст на этой странице. Если он существует, сохраните соответствующий номер страницы в некотором массиве. Повторите это сканирование и разбор цикла для количества страниц в pdf

1 голос
/ 05 марта 2011

http://www.random -ideas.net / сообщений / 42% 22 * ​​1003 *

проверьте, как работает ссылка выше.

0 голосов
/ 31 декабря 2017

Если вы используете PDFDocument вместо CGPDFDocument, этот API имеет операции текстового поиска, такие как findString:withOptions

0 голосов
/ 19 января 2011

Ничего не поделаешь внутри Кварца.Кварц предназначен для отображения графики - ему не нужно знать или заботиться о поиске совпадений строк в PDF.Вам нужно будет использовать методы синтаксического анализа Core Graphics PDF, чтобы извлечь данные, найти строку самостоятельно, а затем получить страницу, на которой она появляется.

...