Как 'annot' CGPDFDictionary 'Rect' переводится в цель c Rect
Как 'annot' CGPDFDictionary 'Rect' переводится в цель c Rect:
1 ответ
Adobe PDF Spec гласит:
Прямоугольники используются для описания местоположений на странице и ограничительных рамок для различных объектов. Прямоугольник должен быть записан в виде массива из четырех чисел, дающих координаты пары диагонально противоположных углов.
Хотя прямоугольники обычно задаются их нижним левым и верхним правым углами, допустимо указывать любые два диагонально противоположных угла. Приложения, которые обрабатывают PDF, должны быть готовы нормализовать такие прямоугольники в ситуациях, когда требуются определенные углы. Как правило, массив принимает форму [llx lly urx ury], определяющую координаты нижнего левого x, нижнего левого y, верхнего правого x и верхнего правого y прямоугольника в указанном порядке. Предполагается, что остальные два угла прямоугольника имеют координаты (llx, ury) и (urx, lly).
Таким образом, это означает, что прямой прямоугольник не является родным, как показано здесь, и должен выглядеть следующим образом:
CGRect rect = CGRectMake(coords[0],coords[3],coords[2]-coords[0],coords[3]-coords[1]);
Посмотрите код Bellow (оригинальный код от pt2ph8), чтобы увидеть контекст массива координат:
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]);