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);

問題は、すべてのポイントをカバーする配列をどのように作成するかです。touches デリゲート メソッド (TouchesMoved など) からポイントを取得していますが、ユーザーが高速で描画すると、一部のポイント/ピクセルがスキップされ、pdf はスキップされたポイントを補間できません。ベジエ曲線は滑らかな曲線を補間して描画できますが、ベジエ曲線はすべてのポイント (スキップされたものを含む) の配列を提供しません。Adobe Reader で PDF を開いたときに滑らかな曲線が表示されるように、そのような配列が必要です。現在、どの iOS デバイスでも滑らかな曲線が得られますが、Adobe Reader では曲線が滑らかではありません。これは、シミュレーターでベジエ曲線を使用して描画された曲線と、Adobe Reader で描画された曲線の比較です。

ここに画像の説明を入力

上の画像は iPad シミュレーターから取得したもので、ベジエ曲線を使用して描画され、滑らかです。

ここに画像の説明を入力

上の画像はAdobe Readerから取得しました。赤い曲線が青い曲線のように滑らかではないことがわかります。スムーズにするにはどうすればいいですか?

4

1 に答える 1