2013-08-06 1 views
1

Согласно «Pdf Reference Version 1.7» оператор текста позиционирование «Tm» описывается следующим образом:Как оператор Tm передает данные в документе PDF с использованием CGPDF?

... Хотя операнды определить матрицу, они передаются Tm как шесть отдельных номеров, а не как массив.

Я не понимаю, как я должен получать серию чисел, которые не являются массивом, строкой или чем-то подобным. Когда я реализую этот код, я получаю, что тип объекта является реальным, и когда я пытаюсь получить его значение, все, что у меня получается, это последний номер массива.

CGPDFOperatorTableSetCallback(table, "Tm", positioningOperator); 

... 

void positioningOperator(CGPDFScannerRef scanner, void *info) 
{ 
    [(__bridge CTPDFParser *)info operatorPositionScanned:scanner]; 
} 

... 

- (void)operatorPositionScanned:(CGPDFScannerRef)scanner 
{ 
    CGPDFContentStreamRef streamRef = CGPDFScannerGetContentStream(scanner); 

    CGPDFObjectRef object; 
    CGPDFScannerPopObject(scanner, &object); 

    CGPDFObjectType type = CGPDFObjectGetType(object); 

    if(type == kCGPDFObjectTypeReal) 
    { 
     CGPDFReal real; 
     if(CGPDFObjectGetValue(object, type, &real)) 
     { 
      // 1 0 0 1 256.3246 669.3472 Tm 
      NSLog(@"%f", real); // Prints only 669.347168 
     } 
    } 
} 

Я проверил, если переданное значение было любого другого типа, но это было только реальным, так что я действительно не знаю, как получить другие числа.

Любая помощь будет оценена по достоинству.

+2

Вы пробовали вытаскивать из сканера более одного объекта? Должно быть шесть номеров для поп-музыки. – mkl

+0

Спасибо! Это то, что я искал –

ответ

2

Каждый оператор PDF имеет свои операнды в стеке. Для каждого оператора, с которым вы работаете, вы должны вывести из стека необходимое количество операндов, как описано в спецификации PDF.

Для оператора Tm вам необходимо выставить 6 операндов из стека.

+0

Спасибо! Я полностью забыл о функциях popping. Сейчас все работает нормально –