Swift PDFの特定範囲をImageに切り出す

2025年3月14日

func renderPDFPage(pdfName: String, pageNumber: Int, croppedCGRect: CGRect) -> UIImage? {
    guard let pdfURL = Bundle.main.url(forResource: pdfName, withExtension: "pdf"),
          let document = PDFDocument(url: pdfURL),
          let page = document.page(at: pageNumber - 1) else { return nil }

    let pageRect = page.bounds(for: .mediaBox)
    let renderer = UIGraphicsImageRenderer(size: pageRect.size)
    let image = 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, y: -1.0)
        context.cgContext.drawPDFPage(page.pageRef!)
    }
    return image.cropped(to: croppedCGRect)
}
import SwiftUI

extension UIImage {
    func cropped(to rect: CGRect) -> UIImage? {
        // スケールを考慮したCGRectに変換
        let scaledRect = CGRect(
            x: rect.origin.x * self.scale,
            y: rect.origin.y * self.scale,
            width: rect.size.width * self.scale,
            height: rect.size.height * self.scale
        )
        
        guard let cgImage = self.cgImage?.cropping(to: scaledRect) else { return nil }
        
        // トリミング後に元のスケールと向きを維持してUIImageを生成
        return UIImage(cgImage: cgImage, scale: self.scale, orientation: self.imageOrientation)
    }
}

SwiftSwift,SwiftUI

Posted by shi-n