LoginSignup
6
2

More than 5 years have passed since last update.

【Swift4】PDFKitで横幅がバラバラのPDFを左寄せにする

Posted at

はじめに

PDFViewでPDFを表示する際に、ページごとに横幅が違うと横幅の小さいPDFは中央寄せになってしまいます。
今回、これを左寄せにする対応をしました。

実装

納めたい大きさのUIImageを作成し、PDFをその左端に描画することで、左寄せになっているPDFを生成します。

let url = URL(/* 表示したいPDFのURL */)
let pdfWidth: CGFloat = 600
var pdfDocument = PDFDocument()
var count = 0

if let document = CGPDFDocument(url as CFURL) {
    // Page数分回して左寄せ処理をし、PDFDocumentに追加していく。
    for pageCount in 0..<document.numberOfPages {
        if let page = document.page(at: pageCount + 1) {
            // CGPDFDocumentから取得したPageをUIImageにする。
            let pageRect = page.getBoxRect(.mediaBox)
            let renderer = UIGraphicsImageRenderer(size: pageRect.size)
            let pageImage = renderer.image { context in
                UIColor.white.set()
                context.fill(pageRect)

                context.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
                context.cgContext.scaleBy(x: 1.0, y: -1.0)

                context.cgContext.drawPDFPage(page)
            }
            // UIImageにしたPageを、納めたい大きさのUIImageに描画する。
            // PDFの高さを取得するために一度PDFPageにする。
            if let pdfPage = PDFPage(image: pageImage) {
                let size = CGSize(width: pdfWidth,
                                  height: pdfPage.bounds(for: .cropBox).height)
                UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
                if let context = UIGraphicsGetCurrentContext() {
                    UIGraphicsPushContext(context)

                    // Pageを画像の左端に描画する。
                    pageImage.draw(at: CGPoint(x: 0, y: 0))

                    UIGraphicsPopContext()
                    // 画像からPDFPageにし、PDFDocumentに追加する。
                    if let newImage = UIGraphicsGetImageFromCurrentImageContext(),
                        let newPdfPage = PDFPage(image: newImage) {
                        pdfDocument.insert(newPdfPage, at: count)
                        count += 1
                    }
                }
            }
        }
    }
}

基本的にコメントの通りですが、左寄せと言うとViewをいじってあれこれしたくなりますがPDFそのものを左寄せにすることで実現することが出来ました。
そのためには一度UIImageを生成し、drawする必要があるということでした。

おわりに

難しそうだなと思いながら調べ始めましたが、CGPDFDocumentがあるのでやろうと思えば色々出来そうです!

6
2
0

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
  3. You can use dark theme
What you can do with signing up
6
2