はじめに
こんにちは、nukkyです。
SwiftでPDFを表示したい場合iOS11以降ならPDFKitがありますが、自分の様にまだ11以前のOSにも対応したい方がいると思うので、今回は備忘録がてらファイルからのPDF表示を行いたいと思います。
前提条件
Xcode 9.1
iOS 11 Simulator
Swift 4.0
実装
まずはPDFを取り扱うUIViewを継承したクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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を表示する様にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 2 | // とりあえず1ページ目を指定 let page = doc!.page(at: 1) |
マルチページに対応する場合はここで表示したいページ数を指定してください。
さいごに
今回はiOS11以前に対応できる様だいぶレガシーな書き方でPDFの表示をしましたが、冒頭でも触れた様にiOS11からPDFがだいぶ楽に表示できる様になったのでこちらも近いうちに紹介できればと思います。
[subscribe2]