はじめに
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があるのでやろうと思えば色々出来そうです!