概要
PDFを印刷したかったのですが、
元データがPDFDocumentで少し詰まったのでまとめておきます。
コード
ボタンを押したら印刷画面が出てくるようになっています。
@objc private func tapPrintingButton(_ sender: UIBarButtonItem) {
let printController = UIPrintInteractionController.shared
let printInfo = UIPrintInfo(dictionary:nil)
printInfo.outputType = .general
printInfo.orientation = .landscape
printController.printInfo = printInfo
printController.printingItem = self.resizePrintingPaper()
printController.present(animated: true, completionHandler: nil)
}
private func resizePrintingPaper() -> NSData? {
// CGPDFDocumentを取得
guard let documentRef = self.PDFView.document?.documentRef else { return nil }
var pageImages: [UIImage] = []
// 表示しているPDFPageをUIImageに変換
for pageCount in 0 ..< documentRef.numberOfPages {
// CGPDFDocument -> CGPDFPage -> UIImage
if let page = documentRef.page(at: pageCount + 1) {
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)
}
// Image配列に格納
pageImages.append(pageImage)
}
}
// UIImageにしたPDFPageをNSDataに変換
let pdfData: NSMutableData = NSMutableData()
let pdfConsumer: CGDataConsumer = CGDataConsumer(data: pdfData as CFMutableData)!
var size: CGSize // ここに印刷したいサイズを入れる
var mediaBox: CGRect = CGRect(origin: .zero, size: size)
let pdfContext: CGContext = CGContext(consumer: pdfConsumer, mediaBox: &mediaBox, nil)!
pageImages.forEach { image in
pdfContext.beginPage(mediaBox: &mediaBox)
pdfContext.draw(image.cgImage!, in: mediaBox)
pdfContext.endPage()
}
return pdfData
}
}
まとめ
PDFDocumentにはdocumentRefプロパティが存在し、CGPDFDocumentが取得できる。
CGPDFDocumentからpageを取得しUIImageに変換する。
CGContext生成時に任意のサイズを指定してやることで任意のサイズで印刷することができました。
もう少しいいやり方がありましたら、教えていただけますと幸いです。