【问题标题】:How to draw smooth ink annotation on PDF in iOS using Objective-C如何使用 Objective-C 在 iOS 中的 PDF 上绘制平滑的墨水注释
【发布时间】: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


【解决方案1】:

根据InkList 数组的 PDF 1.3 规范:

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

从注释 60 开始:

Acrobat 查看器始终将每条路径上的点与 直线。

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

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

【讨论】:

  • 是的,这是一个选项,但即使对于较小的图像,它也会使 pdf 的大小非常大。这不是预期的输出。
  • 无法从 UIBezierPath 获取积分。所以我看到它的唯一方法是计算贝塞尔曲线并手动生成带点的数组。
猜你喜欢
  • 2020-11-17
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2018-11-01
  • 2023-03-11
相关资源
最近更新 更多