如何使用Objective-C在iOS中在PDF上绘制平滑的墨迹注释

时间:2015-09-08 06:55:44

标签: ios drawing bezier podofo pdf-annotations

我使用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)获得分数,但是当用户以高速度绘制时,则跳过一些点/像素,并且pdf无法为自己插入那些跳过的点。贝塞尔曲线可以插值和绘制平滑曲线,但贝塞尔曲线不提供所有点的数组(包括跳过的曲线),我需要这样的数组,以便在adobe中打开pdf时读者,它显示平滑的曲线。现在我在任何iOS设备上都能获得平滑的曲线但是在adobe reader上曲线并不平滑。下面是曲线的比较,一个是在模拟器中使用 Bezier-curves 绘制的,另一个是在adobe reader中绘制的。

enter image description here

上图是从iPad模拟器拍摄的,使用贝塞尔曲线绘制并且平滑。

enter image description here

以上图片来自adobe reader。您可以看到红色曲线不像蓝色曲线那样平滑。我该如何顺利?

1 个答案:

答案 0 :(得分:0)

根据{1.3}规范的{1.3}规范:

  

n个数组的数组,每个数组表示一个描边路径。每个阵列都是   默认用户空间中一系列交替的x和y坐标,   指定沿路径的点。绘制时,点是连接的   通过直线或曲线以依赖于实现的方式。 (看到   附录H中的实施说明60。)

从注释60开始:

  

Acrobat查看器始终将每条路径上的点连接起来   直线。

所以你不能像bezier曲线一样有流畅的线条。直到1.7版本都是如此。

使其平滑的唯一方法是使用Core Graphics渲染为图像并将其添加到PDF。