Как "аннотировать" CGPDFDictionary "Rect" переводят на объективный c Rect

Как "аннотировать" CGPDFDictionary "Rect" переводят на объектив c Rect:

Ответы

Ответ 1

Adobes PDF Spec:

Прямоугольники используются для описания местоположения на странице и ограничивающие поля для множества объектов. Прямоугольник должны быть записаны как массив из четырех числа, дающие координаты пара диагонально противоположных углов.

Хотя прямоугольники обычно указанных их нижними левыми и верхние правые углы, это приемлемо указать любые две диагонально противоположные углы. Приложения, обрабатывающие PDF файлы должны быть готовы к нормализации таких прямоугольников в ситуациях, когда требуются определенные углы. Как правило, массив принимает форму [llx lly urx ury], указав нижний левый x, нижний левый y, верхний правый x и верхний правый y координаты прямоугольника, в этом заказ. Остальные два угла тогда предполагается, что прямоугольник имеет координаты (llx, yury) и (urx, lly).

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

CGRect rect = CGRectMake(coords[0],coords[3],coords[2]-coords[0],coords[3]-coords[1]);

Смотрите код Bellow (исходный код BrainFeeder), чтобы увидеть контекст массива coords:

CGPDFArrayRef rectArray;
                if(CGPDFDictionaryGetArray(annotDict, "Rect", &rectArray)) {
                    //continue;

                    CGPDFReal coords[4];

                    for( int k = 0; k < arrayCount; ++k ) {

                        CGPDFObjectRef rectObj;
                        if(!CGPDFArrayGetObject(rectArray, k, &rectObj)) {
                            continue;
                        }

                        CGPDFReal coord;
                        if(!CGPDFObjectGetValue(rectObj, kCGPDFObjectTypeReal, &coord)) {
                            continue;
                        }

                        coords[k] = coord;
                    }      

                }

                //blx,bly,trx,try>tlx,tly,w,h

                CGRect rect = CGRectMake(coords[0],coords[3],coords[2]-coords[0],coords[3]-coords[1]);