PDF Annotation
を追加する

とりあえず、試行錯誤の末、PDFView 上の PDF Document にハイライト表示ができたので、そのメモ。他のタイプのもの(コメントとか、記号とか)も、自分で使う必要が出るか、時間があって試したときにでも追加する予定。

PDF Document にハイライト表示を追加する

PDFView に表示された PDFDocument にハイライト表示をするには、PDFAnnotation のサブクラスの一つである PDFAnnotationMarkup を使う。

まず必要なのが、選択されたテキストの情報を得ること。これは、PDFView の currentSelection というメソッドを使う。これで、PDFSelection のオブジェクトが返ってくる。

currentSelection = @pdfView.currentSelection

この選択した部分が吹く数行にまたがっている可能性もあるので、まとめてハイライトではなく、一行ごとに処理するために、PDFSelectionselectionsByLine というメソッドを使う。これで、一行ごとの PDF Selection オブジェクトが配列で返ってくるので、これをブロックで処理する。

@pdfView.currentSelection.selectionsByLine.each do |line|

# 処理

end

さて、この一行ごとの PDFSelection オブジェクトに対して処理を行っていく。

次に必要なのが、この選択部分がどのページにあるかという情報なので PDFSelectionpages というメソッドを使う。これもページが PDFPage オブジェクトの配列で返ってくるので、ブロックで処理する。

line.pages.each do |page|

# 処理

end

ここで、選択部分のそれぞれの行があるページで、選択部分の bounds(領域)を PDFSelectionboundsForPage(page) というメソッドで得る。

bounds = line.boundsForPage(page)

これで、Annotation をつける領域が得られた。

次に、この bounds を使って、initWithBounds(bounds)PDFAnnotationMarkup オブジェクトを 作る。

annotation = PDFAnnotationMarkup.alloc.initWithBounds(bounds)

作ったら、この PDFAnnotationMarkup オブジェクトのタイプを setMarkupType(type) で設定する。これには、次の3つが定数として定められている、と、PDFKit のドキュメントにはあるけど、RubyCocoa(Snow Leopard 標準バージョン)では、定数として認識してくれない。なので、直接数字を入力する。上から 0、1、2 となっている。

kPDFMarkupTypeHighlight(ハイライト): 0

kPDFMarkupTypeStrikeOut(打ち消し): 1

kPDFMarkupTypeUnderline(下線): 2

annotation.setMarkupType(0)

つぎに、ハイライトの色を setColor(NSColor) で設定する。色の扱いでちょっとだけ NSColor に付いても触れている。とりあえずここではマジェンタにしてみた。

annotation.setColor(NSColor.magentaColor)

これで設定が終わったので、最後に、PDFPage オブジェクトに設定した Annotation を addAnnotation(annotation) で追加する。

page.addAnnotation(annotation)

ここまでのスクリプトをまとめると、次のような感じ。

@pdfView.currentSelection.selectionsByLine.each do |line|

line.pages.each do |page|

bounds = line.boundsForPage(page)

annotation = PDFAnnotationMarkup.alloc.initWithBounds(bounds)

annotation.setMarkupType(0)

annotation.setColor(NSColor.magentaColor)

page.addAnnotation(annotation)

end

end