PDF 文書を扱うときに、ある文字列を検索したいというのがよくある。ここでは、それに関してメモしていくつもり。自分が必要とする機能を試しながら順次書き足していく。基本的には PDFDocument オブジェクトに対して検索のメソッドを使う。PDFDocument オブジェクトは、PDFView に対して document というメソッドで取り出す。
pdfDoc = @pdfView.document
まず、PDF Document オブジェクト内のすべての検索文字列を見つける方法。これは、文書内すべてを検索かけてリストにして表示する、なんてときに使えるんじゃないだろうか。
これには、findString_withOptions(string,option) というメソッドを使う。これを使うと、見つかった部分の PDFSelection オブジェクトが配列で返る。string は NSString オブジェクト。まあ、Ruby の String オブジェクトでいい。オプションには、次のようなものがデベロッパドキュメントにあった。
実際使ったわけではないので、どういう結果になるのかよくわかんないものもある。Objective-C では、複数のオプションを使うときは、
(option1 | option2 | option3)
というように書いてあるけど、RubyCocoa でもこれでいけるかどうかは試してない。
まあ、ここでは、大文字小文字の区別を無視して検索するだけにする。
selections = @pdfView.document.findString_withOptions(string,NSCaseInsensitiveSearch)
これで、返ってきた配列に入っている PDFSelection オブジェクトに対して処理をする。
次は、文字列を検索して、次に見つかったところに移動する方法。よくある、検索かけて、もう一度検索かけると次に見つかったところに移動するってやつ。
これは、PDF Document オブジェクトに対して findString_fromSelection_withOptions(string,selection,option) を使う。これに必要なのは、検索する文字列と、PDF Document 内の今の選択された部分(表示されたばかりだと文書の先頭)、それと、検索オプション。
まず、PDF Document の現在の選択部分を取り出すために、PDFView に対して currentSelection というメソッドを使う。これで、選択位置の情報を持った PDFSelection オブジェクトが返る。
currentSelection = @pdfView.currentSelection
次に、PDFView から document というメソッドを使って取り出した PDF Document オブジェクトに対して findString_fromSelection_withOptions(string,selection,option) を使う。string は検索したい文字列、selection は PDFSelection オブジェクト、そしてオプション。
selection = @pdfView.document.findString_fromSelection_withOptions(searchString,currentSelection,NSCaseInsensitiveSearch)
これで、選択位置がわかるので、PDFView に setCurrentSelection(selection) で選択位置を設定して、scrollSelectionToVisible(sender) で選択位置まで表示を移動する。
@pdfView.setCurrentSelection(selection)
@pdfView.scrollSelectionToVisible(nil)
これをまとめて、実際にアプリケーションで使う形にしてみた。この例では、@pdfSearchString という Text Field から検索文字列を受け取って検索し、見つかったら検索された文字列の所まで移動する。これを searchString(sender) なんていう action にして、ボタンなんかと結びつけると、PDF 検索機能がつけられる。
def searchString(sender)
searchString = @pdfSearchString.stringValue
currentSelection = @pdfView.currentSelection
selection = @pdfView.document.findString_fromSelection_withOptions(searchString,currentSelection,NSCaseInsensitiveSearch)
@pdfView.setCurrentSelection(selection)
@pdfView.scrollSelectionToVisible(nil)
end
ib_action :searchString