2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PDFDocumentからAirPrintでA4サイズ印刷する

Posted at

概要

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生成時に任意のサイズを指定してやることで任意のサイズで印刷することができました。

もう少しいいやり方がありましたら、教えていただけますと幸いです。

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?