2010-09-02 3 views
8

un'altra domanda per quanto riguarda l'analisi pdf ... Basta leggere PDF Reference versione 1.7 "5.3.1 Text-posizionamento Operatori" e io sono un po 'confuso.Ottenere la posizione del testo durante l'analisi pdf con Quartz 2D

Ho scritto del codice per ottenere la matrice di trasformazione e la posizione del testo iniziale.

 CGPDFOperatorTableSetCallback (table, "MP", &op_MP);//Define marked-content point 
    CGPDFOperatorTableSetCallback (table, "DP", &op_DP);//Define marked-content point with property list 
    CGPDFOperatorTableSetCallback (table, "BMC", &op_BMC);//Begin marked-content sequence 
    CGPDFOperatorTableSetCallback (table, "BDC", &op_BDC);//Begin marked-content sequence with property list 
    CGPDFOperatorTableSetCallback (table, "EMC", &op_EMC);//End marked-content sequence 

    //Text State operators 
    CGPDFOperatorTableSetCallback(table, "Tc", &op_Tc); 
    CGPDFOperatorTableSetCallback(table, "Tw", &op_Tw); 
    CGPDFOperatorTableSetCallback(table, "Tz", &op_Tz); 
    CGPDFOperatorTableSetCallback(table, "TL", &op_TL); 
    CGPDFOperatorTableSetCallback(table, "Tf", &op_Tf); 
    CGPDFOperatorTableSetCallback(table, "Tr", &op_Tr); 
    CGPDFOperatorTableSetCallback(table, "Ts", &op_Ts); 

    //text showing operators 
    CGPDFOperatorTableSetCallback(table, "TJ", &op_TJ); 
    CGPDFOperatorTableSetCallback(table, "Tj", &op_Tj); 
    CGPDFOperatorTableSetCallback(table, "'", &op_apostrof); 
    CGPDFOperatorTableSetCallback(table, "\"", &op_double_apostrof); 

    //text positioning operators   
    CGPDFOperatorTableSetCallback(table, "Td", &op_Td); 
    CGPDFOperatorTableSetCallback(table, "TD", &op_TD); 
    CGPDFOperatorTableSetCallback(table, "Tm", &op_Tm); 
    CGPDFOperatorTableSetCallback(table, "T*", &op_T); 

    //text object operators 
    CGPDFOperatorTableSetCallback(table, "BT", &op_BT);//Begin text object 
    CGPDFOperatorTableSetCallback(table, "ET", &op_ET);//End text object 

Quindi questo è l'uscita dopo pranzo applicazione:

2010-09-02 15:09:23.041 testSearch[8251:207] op_BT begin 
    Integer value: 0 
    2010-09-02 15:09:23.043 testSearch[8251:207] op_BT end 
    2010-09-02 15:09:23.043 testSearch[8251:207] op_Tf begin 
    Integer value: 1 
    2010-09-02 15:09:23.044 testSearch[8251:207] op_Tf end 
    2010-09-02 15:09:23.044 testSearch[8251:207] op_Tm begin 
    Float value: 557.364197 
    2010-09-02 15:09:23.045 testSearch[8251:207] op_Tm end 
    2010-09-02 15:09:23.045 testSearch[8251:207] op_TJ begin 
    2010-09-02 15:09:23.046 testSearch[8251:207] Array string value [0]: F 
    2010-09-02 15:09:23.046 testSearch[8251:207] Array integer value [1]: 94985208 
    2010-09-02 15:09:23.047 testSearch[8251:207] Array string value [2]: r 
    2010-09-02 15:09:23.047 testSearch[8251:207] Array integer value [3]: 94985208 
    2010-09-02 15:09:23.048 testSearch[8251:207] Array string value [4]: o 
    2010-09-02 15:09:23.048 testSearch[8251:207] Array integer value [5]: 94985208 
    2010-09-02 15:09:23.049 testSearch[8251:207] Array string value [6]: m s 
    2010-09-02 15:09:23.049 testSearch[8251:207] Array integer value [7]: 94985208 
    2010-09-02 15:09:23.049 testSearch[8251:207] Array string value [8]: a 
    2010-09-02 15:09:23.050 testSearch[8251:207] Array integer value [9]: 94985208 
    2010-09-02 15:09:23.050 testSearch[8251:207] Array string value [10]: m 
    2010-09-02 15:09:23.051 testSearch[8251:207] Array integer value [11]: 94985208 
    2010-09-02 15:09:23.051 testSearch[8251:207] Array string value [12]: p 
    2010-09-02 15:09:23.052 testSearch[8251:207] Array integer value [13]: 94985208 
    2010-09-02 15:09:23.053 testSearch[8251:207] Array string value [14]: l 
    2010-09-02 15:09:23.054 testSearch[8251:207] Array integer value [15]: 94985208 
    2010-09-02 15:09:23.055 testSearch[8251:207] Array string value [16]: e t 
    2010-09-02 15:09:23.055 testSearch[8251:207] Array integer value [17]: 94985208 
    2010-09-02 15:09:23.057 testSearch[8251:207] Array string value [18]: o r 
    2010-09-02 15:09:23.057 testSearch[8251:207] Array integer value [19]: 94985208 
    2010-09-02 15:09:23.058 testSearch[8251:207] Array string value [20]: e 
    2010-09-02 15:09:23.058 testSearch[8251:207] Array integer value [21]: 94985208 
    2010-09-02 15:09:23.059 testSearch[8251:207] Array string value [22]: s 
    2010-09-02 15:09:23.059 testSearch[8251:207] Array integer value [23]: 94985208 
    2010-09-02 15:09:23.060 testSearch[8251:207] Array string value [24]: u 
    2010-09-02 15:09:23.061 testSearch[8251:207] Array integer value [25]: 94985208 
    2010-09-02 15:09:23.061 testSearch[8251:207] Array string value [26]: l 
    2010-09-02 15:09:23.062 testSearch[8251:207] Array integer value [27]: 94985208 
    2010-09-02 15:09:23.062 testSearch[8251:207] Array string value [28]: t 
    2010-09-02 15:09:23.063 testSearch[8251:207] op_TJ end 

Se qualcuno è a conoscenza della matrice di testo e gli operatori di posizionamento di testo sarebbe bello per spiegare come tutti coloro che il lavoro cosa.

Come calcolare la posizione del testo (o glifo?) Utilizzando Tm (matrice di trasformazione e altri dati)?

+2

hai scoperto come utilizzare gli operatori? Grazie! – pt2ph8

risposta

4

@ Koteg: Ciao! Sei finalmente riuscito a farlo funzionare? Per Tm, sono in grado di ottenere tutti e sei i valori, ma per ora non riesco a vedere come ottenere la posizione di una parola in una riga ... Ho un'idea: se siamo in Tj, basta avere lo spazio tra le lettere (saltando sempre lo stesso ogni volta) e con Tm, ottieni la posizione di una parola. Nel caso di TJ, questo è molto più complicato: ottenere il valore della traduzione orizzontale da sottrarre alla matrice Tm per ogni parte dell'array, ma la ricerca di una parola in quell'array sarà più complicata rispetto a Tj.

BTW, per gli altri le persone:

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); 
     NSLog(@"array data : %@", data); 

     [searcher.currentData appendFormat:@"%@", data]; 
     [data release]; 
    } 

    CGPDFReal real; 
    success = CGPDFArrayGetNumber(array, n+1, &real); 
    if(success) 
    { 
     NSLog(@"array real : %f", real); 
    } 
} 

Grazie