はじめに
SwiftでPDFを表示・編集するために、PDFKitを初めて使う機会がありました。
その際に調べて利用したのが、PDFAnnotation(PDFの注釈機能)です。
もしPDFに編集などしたい、という方が他にいらっしゃった際の参考になれば幸いです。
PDFAnnotationを使うことで、PDFのページ毎に注釈を設定できます。
これにより、複数ページで構成されるPDFでページ間を移動しても、
注釈はページ毎の指定位置に設定されたままで、テキスト表示やハイライト、テキスト入力などが行えます。
また、タップしたPDFAnnotationはNotificationCenterで取得することができるので、
タップ時にハイライトにするなどの処理を行うこともできます。
ここでは、単純なPDFAnnotationの設定から、タップされた時の検知までを記載します。
①PDFに対してPDFAnnotationを設定する
注釈を設定したいPDFPageを指定して、定義したPDFAnnotationを設定します。
ここでは単純なテキスト表示を行うため、PDFAnnotationSubTypeにfreeTextを用いた例としています。
他にも様々な種類のPDFAnnotationSubTypeを指定して利用できます。
(参考: https://developer.apple.com/documentation/pdfkit/pdfannotationsubtype)
// PDFAnnotationの設定
let annotation = PDFAnnotation(bounds: CGRect(x: 200, y: 400, width: 200, height: 50), forType: .freeText, withProperties: nil)
annotation.contents = "PDFAnnotation"
annotation.font = .systemFont(ofSize: 14)
annotation.fontColor = .black
annotation.color = .clear
// 対象のPDFPageへPDFAnnotationを設定する
pdfView?.currentPage?.addAnnotation(annotation)
②PDF Annotationがタップされたかを監視、タップに対する処理を行う
次のようにNotificationCenterでPDFAnnotationのタップを検知できます。
ページ内に複数のPDFAnnotationがあっても、タップされたものを特定して個別の処理ができます。
// PDFAnnotationがタップされたかを監視する
NotificationCenter.default.addObserver(self, selector: #selector(action(_:)), name: .PDFViewAnnotationHit, object: nil)
@objc func action(_ sender: Any) {
// タップされたPDFAnnotationを取得する
guard let notification = sender as? Notification,
let annotation = notification.userInfo?["PDFAnnotationHit"] as? PDFAnnotation else {
return
}
// タップされたPDFAnnotationに対する処理
}
おわりに
PDFAnnotationはあくまでPDFの注釈ですが、うまく利用することでPDFへ直接テキストなどを埋め込んで編集する、などに応用できます。
このため、PDFAnnotationを利用することでPDFは意外と色々な編集ができることがわかりました。
何かの機会にPDF編集が必要だったら、この機能の利用を考えてみようと思います。