2010-09-02 20 views
8

một câu hỏi khác về phân tích cú pháp pdf ... Chỉ cần đọc phiên bản PDF Reference 1.7 "5.3.1 Nhà điều hành định vị văn bản" và tôi hơi bối rối.Lấy vị trí văn bản trong khi phân tích cú pháp pdf với Quartz 2D

Tôi đã viết một số mã để lấy ma trận chuyển đổi và vị trí văn bản ban đầu.

 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 

Vì vậy, đây là sản phẩm sau khi ăn trưa ứng dụng:

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 

Nếu ai đó quen thuộc với ma trận văn bản và khai thác vị trí văn bản nó sẽ được tốt đẹp để giải thích như thế nào tất cả những công việc điều.

Cách tính vị trí văn bản (hoặc glyph?) Bằng cách sử dụng Tm (ma trận chuyển đổi và dữ liệu khác)?

+2

bạn đã tìm hiểu làm thế nào để sử dụng những nhà khai thác? Cảm ơn! – pt2ph8

Trả lời

4

@Koteg: Xin chào! Bạn cuối cùng đã xoay xở để có được nó hoạt động? Đối với Tm, tôi có thể nhận được tất cả sáu giá trị, nhưng bây giờ tôi không thể thấy làm thế nào để có được vị trí của một từ vào một dòng ... Tôi có một ý tưởng: nếu chúng ta đang ở trong Tj, chỉ nhận được khoảng cách giữa các chữ cái (nhảy cùng một lúc) và với Tm, nhận vị trí của một từ. Trong trường hợp TJ, điều này phức tạp hơn: lấy giá trị dịch ngang để trừ vào ma trận Tm cho mỗi phần của mảng, nhưng việc tìm kiếm một từ trong mảng đó sẽ phức tạp hơn Tj.

BTW, cho người khác người:

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

Cảm ơn

Các vấn đề liên quan