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)
}
}