2011-01-19 4 views
3

J'utilise du quartz pour afficher le pdf. J'ai besoin d'obtenir les index des pages où mon texte de recherche existe. Est-ce que quelqu'un peut m'aider? Merci.Comment rechercher du texte en document pdf avec du quartz

Solution: Il existe un exemple de code qui extrait un texte de la page et le vérifie pour les séquences.

#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

ne pas oublier CGPDFOperatorTableRelease (tableau) dans dealloc, ou vous obtenez des fuites désagréables gros. – steipete

Répondre

2

Utilisez CGPDFDocument, CGPDFPage et CGPDFScanner pour analyser et analyser le contenu de la page dans NSString. Ensuite, utilisez la fonction NSString pour trouver le texte sur cette page. S'il existe, stockez le numéro de page correspondant dans un tableau. Répétez cette analyse et d'analyse syntaxique pour la boucle pour le nombre de pages dans le pdf

0

Il n'y a rien à faire à l'intérieur de Quartz. Quartz est pour l'affichage graphique - il n'a pas besoin de savoir, ou se soucier de, rechercher un fichier PDF pour les correspondances de chaînes. Vous devrez utiliser les méthodes d'analyse du PDF Core Graphics pour extraire les données, rechercher vous-même la chaîne, puis obtenir la page sur laquelle elle apparaît.

0

Si vous utilisez PDFDocument, au lieu de CGPDFDocument, que l'API a le texte des opérations de recherche, tels que findString:withOptions

Questions connexes