2010-09-02 29 views
8

otra pregunta con respecto al análisis de PDF ... Acabo de leer PDF Referencia versión 1.7 "5.3.1 Operadores de posicionamiento de texto" y estoy un poco confundido.Obteniendo posición de texto mientras analiza PDF con Cuarzo 2D

Escribí un código para obtener la matriz de transformación y la posición inicial del texto.

 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 

Así que esta es la salida después del almuerzo aplicación:

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 

Si alguien está familiarizado con matriz de texto y los operadores de posicionamiento de texto sería bueno para explicar cómo todos los que trabajo.

¿Cómo se calcula la posición del texto (o glifo?) Utilizando Tm (matriz de transformación y otros datos)?

+2

has averiguado cómo utilizar los operadores? ¡Gracias! – pt2ph8

Respuesta

4

@Koteg: ¡Hola! ¿Finalmente has logrado que funcione? Para Tm, puedo obtener todos los seis valores, pero por ahora no puedo ver cómo poner la posición de una palabra en una línea ... Tengo una idea: si estamos en Tj, solo consigues el espacio entre letras (saltando esto siempre) y con Tm, obtener la posición de una palabra. En el caso de TJ, esto es bastante más complicado: obtenga el valor de la traducción horizontal para sustraerse a la matriz Tm para cada parte de la matriz, pero buscar una palabra en esa matriz será más complicado que para Tj.

BTW, para otros la gente:

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); 
    } 
} 

Gracias

Cuestiones relacionadas