Как нарисовать гладкую аннотацию чернил на PDF в iOS с помощью Objective-C
Я рисую чернильную аннотацию в формате PDF, используя target-c. В спецификациях PDF говорится, что мы должны предоставить массив точек для рисования чернилами. Я использую библиотеку PoDoFo.
Вот как я сейчас рисую чернильную аннотацию:
PoDoFo::PdfArray arr; //This is the array of points to be drawn
arr.push_back(X1);
arr.push_back(Y1);
arr.push_back(X2);
arr.push_back(Y2);
arr.push_back(X3);
arr.push_back(Y3);
.
.
.
arr.push_back(Xn-1);
arr.push_back(Yn-1);
arr.push_back(Xn);
arr.push_back(Yn);
PoDoFo::PdfMemDocument* doc = (PoDoFo::PdfMemDocument *)aDoc;
PoDoFo::PdfPage* pPage = doc->GetPage(pageIndex);
//PageIndex is page number
if (! pPage) {
// couldn't get that page
return;
}
PoDoFo::PdfAnnotation* anno;
PoDoFo::EPdfAnnotation type= PoDoFo::ePdfAnnotation_Ink;
PoDoFo::PdfRect rect;
rect.SetBottom(aRect.origin.y);
rect.SetLeft(aRect.origin.x);
rect.SetHeight(aRect.size.height);
rect.SetWidth(aRect.size.width);
//aRect is CGRect where annotation is to be drawn on page
anno = pPage->CreateAnnotation(type , rect);
anno->GetObject()->GetDictionary().AddKey("InkList", arr);
Проблема в том, как мне сделать массив, который охватывает каждую точку. Я получаю очки от методов делегатов touch (например, TouchesMoved), но когда пользователь рисует с высокой скоростью, некоторые точки / пиксели пропускаются, и pdf просто не может интерполировать эти пропущенные точки для себя. Кривые Безье могут интерполировать и рисовать плавные кривые, но кривая Безье не предоставляет мне массив всех точек (включая пропущенную), и мне нужен такой массив, чтобы при открытии файла PDF в Adobe Reader он отображал плавные кривые. Прямо сейчас я получаю плавную кривую на любом устройстве iOS, но кривая не гладкая на Adobe Reader. Вот сравнение кривых, одна нарисована с использованием кривых Безье в симуляторе, а другая в Adobe Reader.
Выше изображение взято из симулятора iPad, который нарисован с использованием кривой Безье и является гладким.
Выше фотография взята из Adobe Reader. Вы можете видеть, что красная кривая не гладкая, как синяя. Как мне сделать это гладко?
1 ответ
Согласно спецификации PDF 1.3 для InkList
массив:
Массив из n массивов, каждый из которых представляет штриховой путь. Каждый массив представляет собой последовательность чередующихся координат x и y в пользовательском пространстве по умолчанию, определяя точки вдоль пути. При рисовании точки соединяются прямыми линиями или кривыми в зависимости от реализации. (См. Примечание к реализации 60 в Приложении H.)
И из примечания 60:
Зрители Acrobat всегда соединяют точки на каждом пути прямыми линиями.
Таким образом, вы не можете иметь гладкую линию здесь, как кривая Безье. Это верно до версии 1.7.
Единственный способ сделать это гладким - это отобразить изображение с помощью Core Graphics и добавить его в PDF.