2010-09-02 3 views
8

eine andere Frage bezüglich pdf-Analyse ... Lesen Sie einfach PDF-Referenzversion 1.7 "5.3.1 Text-Positionierung Operatoren" und ich bin ein wenig verwirrt.Textposition beim Parsing von PDF mit Quartz 2D

Ich schrieb einen Code, um Transformationsmatrix und anfängliche Textposition zu erhalten.

 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 

Das ist also der Ausgang nach Anwendung Mittagessen:

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 

Wenn jemand mit Textmatrix und Textpositionierung Operatoren vertraut ist, wäre es schön, zu erklären, wie alle, was Arbeit.

Wie Textposition (oder Glyphe?) Mit Tm (Transformationsmatrix und andere Daten) zu berechnen?

+2

haben Sie herausgefunden, wie man diese Operatoren benutzen? Vielen Dank! – pt2ph8

Antwort

4

@Koteg: Hallo! Hast du es endlich geschafft, es zum Laufen zu bringen? Für Tm, bin ich in der Lage, alle sechs Werte zu bekommen, aber für jetzt kann ich nicht sehen, wie man die Position eines Wortes in eine Linie bringt ... Ich habe eine Idee: wenn wir in Tj sind, einfach bekommen der Abstand zwischen den Buchstaben (hüpft immer gleich) und mit Tm die Position eines Wortes. Im Fall von TJ ist dies ziemlich komplizierter: man kann den Wert der horizontalen Translation für jeden Teil des Arrays zur Tm-Matrix subtrahieren, aber das Suchen eines Wortes in diesem Array wird komplizierter als für Tj.

BTW, für andere Menschen:

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

Dank