カテゴリー: iOS

SwiftでPDFを表示する(iOS11以前対応版)

はじめに

こんにちは、nukkyです。
SwiftでPDFを表示したい場合iOS11以降ならPDFKitがありますが、自分の様にまだ11以前のOSにも対応したい方がいると思うので、今回は備忘録がてらファイルからのPDF表示を行いたいと思います。

前提条件

Xcode 9.1
iOS 11 Simulator
Swift 4.0

 

実装

まずはPDFを取り扱うUIViewを継承したクラスを作成します。

import UIKit
import CoreGraphics

class PDFView: UIView {
    var page: CGPDFPage?
    
    override func draw(_ rect: CGRect) {
        guard let page = page else { return }
        
        let context = UIGraphicsGetCurrentContext()
        
        context!.translateBy(x: 0, y: rect.size.height)
        context!.scaleBy(x: 1.0, y: -1.0)
        
        let box = page.getBoxRect(.artBox)
        
        let xScale = rect.size.width / box.size.width
        let yScale = rect.size.height / box.size.height
        let scale = min(xScale, yScale)
        
        let tx = (rect.size.width - box.size.width * scale) / 2
        let ty = (rect.size.height - box.size.height * scale) / 2
        print("\(tx) \(ty) \(scale)")
        context!.translateBy(x: 0, y: ty)
        
        context!.scaleBy(x: scale, y: scale)
        
        context!.drawPDFPage(page)
    }
}

ファイルを指定してPDFを表示する様にします。

func pdfLoad(fileName:String) -> PDFView {
    let dir: URL = FileManager.default.urls( for: .libraryDirectory, in: .userDomainMask )[0]
    let pathFileName = dir.appendingPathComponent( fileName )
    
    let doc = CGPDFDocument(pathFileName as CFURL)
    
    pages = doc!.numberOfPages
    // とりあえず1ページ目を指定
    let page = doc!.page(at: 1)
    let box = page?.getBoxRect(.mediaBox)
    let pdfView = PDFView(frame: CGRect(x: 0, y: 0, width: (box?.size.width)!, height: (box?.size.height)!))
    
    pdfView.backgroundColor = UIColor.white
    pdfView.page = page
    
    return pdfView
}

注意としては、今回このサンプルではシングルページのPDF前提で作成されています。

// とりあえず1ページ目を指定
let page = doc!.page(at: 1)

マルチページに対応する場合はここで表示したいページ数を指定してください。

 

さいごに

今回はiOS11以前に対応できる様だいぶレガシーな書き方でPDFの表示をしましたが、冒頭でも触れた様にiOS11からPDFがだいぶ楽に表示できる様になったのでこちらも近いうちに紹介できればと思います。

[subscribe2]

nukky

シェア
執筆者:
nukky
タグ: Swift

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前