PDF Annotation
を追加する
とりあえず、試行錯誤の末、PDFView 上の PDF Document にハイライト表示ができたので、そのメモ。他のタイプのもの(コメントとか、記号とか)も、自分で使う必要が出るか、時間があって試したときにでも追加する予定。
PDF Document にハイライト表示を追加する
PDFView に表示された PDFDocument にハイライト表示をするには、PDFAnnotation のサブクラスの一つである PDFAnnotationMarkup を使う。
まず必要なのが、選択されたテキストの情報を得ること。これは、PDFView の currentSelection というメソッドを使う。これで、PDFSelection のオブジェクトが返ってくる。
currentSelection = @pdfView.currentSelection
この選択した部分が吹く数行にまたがっている可能性もあるので、まとめてハイライトではなく、一行ごとに処理するために、PDFSelection の selectionsByLine というメソッドを使う。これで、一行ごとの PDF Selection オブジェクトが配列で返ってくるので、これをブロックで処理する。
@pdfView.currentSelection.selectionsByLine.each do |line|
# 処理
end
さて、この一行ごとの PDFSelection オブジェクトに対して処理を行っていく。
次に必要なのが、この選択部分がどのページにあるかという情報なので PDFSelection の pages というメソッドを使う。これもページが PDFPage オブジェクトの配列で返ってくるので、ブロックで処理する。
line.pages.each do |page|
# 処理
end
ここで、選択部分のそれぞれの行があるページで、選択部分の bounds(領域)を PDFSelection の boundsForPage(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