search
LoginSignup
3

More than 1 year has passed since last update.

はじめに

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編集が必要だったら、この機能の利用を考えてみようと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3