【发布时间】:2015-12-03 17:51:50
【问题描述】:
我正在使用objective-c 在pdf 中绘制墨水注释。 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);
问题是我如何制作一个涵盖每个点的数组。我从触摸委托方法(例如 TouchesMoved)中获得点数,但是当用户以高 velocity 绘制时,会跳过一些点/像素,而 pdf 无法为自己插入这些跳过的点。贝塞尔曲线可以插值并绘制平滑曲线,但 Bezier-curve 没有提供所有点的数组(包括跳过的点),我需要这样一个数组,以便在 adobe 中打开 pdf 时读者,它显示了平滑的曲线。现在我在任何 iOS 设备上都能获得平滑的曲线,但在 adobe reader 上曲线并不平滑。这是曲线的比较,一个在模拟器中使用 Bezier-curves 绘制,另一个在 adobe reader 中绘制。
上图取自iPad模拟器,使用贝塞尔曲线绘制,平滑。
上图取自adobe reader。你可以看到红色曲线不像蓝色曲线那样平滑。如何让它顺利?
【问题讨论】:
-
感谢您的代码。这是我在互联网上可以找到的唯一使用 Podofo 添加墨迹注释的示例代码。我需要指出最后一行代码是错误的。我们应该在 InkList 中添加一个点数组而不是点数组。
标签: ios drawing bezier podofo pdf-annotations