2

我正在使用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 reader 中打开 pdf 时,它显示平滑曲线。现在我在任何 iOS 设备上都能获得平滑的曲线,但在 adobe reader 上曲线并不平滑。这是曲线的比较,一个在模拟器中使用贝塞尔曲线绘制,另一个在 adobe reader 中绘制。

在此处输入图像描述

上图取自 iPad 模拟器,使用贝塞尔曲线绘制,平滑。

在此处输入图像描述

上图取自adobe reader。你可以看到红色曲线不像蓝色曲线那样平滑。我怎样才能使它顺利?

4

1 回答 1

0

根据InkList数组的 PDF 1.3 规范:

一个由 n 个数组组成的数组,每个数组代表一个描边路径。每个数组都是默认用户空间中一系列交替的 x 和 y 坐标,指定路径上的点。绘制时,这些点通过直线或曲线以与实现相关的方式连接。(见附录 H 中的实施说明 60。)

从注释 60 开始:

Acrobat 查看器总是用直线连接每条路径上的点。

所以你不能像贝塞尔曲线那样有平滑的线条。直到版本 1.7 都是如此。

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

于 2015-09-08T08:18:05.073 回答