【问题标题】:Rotate the UIImage from CGPDFPage从 CGPDFPage 旋转 UIImage
【发布时间】:2026-02-23 16:10:01
【问题描述】:

使用https://www.hackingwithswift.com/example-code/core-graphics/how-to-render-a-pdf-to-an-image的方法后

func drawPDFfromURL(url: URL) -> UIImage? {

    guard let document = CGPDFDocument(url as CFURL) else { return nil }
    guard let page = document.page(at: 1) else { return nil }

    let pageRect = page.getBoxRect(.mediaBox)

    let renderer = UIGraphicsImageRenderer(size: pageRect.size)
    let img = renderer.image { ctx in

        UIColor.white.set()

        ctx.fill(pageRect)
        ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
        ctx.cgContext.scaleBy(x: 1.0, y: -1.0)

        ctx.cgContext.drawPDFPage(page)
    }

    return img
}

我想直接使用旋转输出图像

 ctx.rotate(by: 90/180*CGFloat.pi)

但它不起作用。任何帮助都将不胜感激。

【问题讨论】:

    标签: ios pdf core-graphics


    【解决方案1】:

    在最简单的情况下,生成的图像的宽度应该是 PDF 的高度,图像的高度应该是 PDF 的宽度,因为我们要旋转输出:

    func drawPDFfromURL(url: URL) -> UIImage? {
    
        guard let document = CGPDFDocument(url as CFURL) else { return nil }
        guard let page = document.page(at: 1) else { return nil }
    
        let pageRect = page.getBoxRect(.mediaBox)
    
        let imageSize = CGSize(width: pageRect.height, height: pageRect.width)
        let imageRect = CGRect(origin: CGPoint(x: 0, y: 0), size: imageSize)
        let renderer = UIGraphicsImageRenderer(size: imageSize)
        let img = renderer.image { ctx in
            UIColor.white.set()
    
            ctx.fill(imageRect)
            ctx.cgContext.rotate(by:CGFloat.pi / 2)
            ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
    
            ctx.cgContext.drawPDFPage(page)
        }
    
        return img
    }
    

    此代码给出以下结果(超级视图的背景为绿色,以更好地区分生成的图像与白色背景):

    您很可能不想使用与 PDF 完全相同的大小值。相反,您可能希望将图像分辨率乘以一个因子。那么代码将如下所示:

    func drawPDFfromURL(url: URL) -> UIImage? {
    
        guard let document = CGPDFDocument(url as CFURL) else { return nil }
        guard let page = document.page(at: 1) else { return nil }
    
        let pageRect = page.getBoxRect(.mediaBox)
        let factor: CGFloat = 3.0
        let imageSize = CGSize(width: pageRect.height * factor, height: pageRect.width * factor)
        let imageRect = CGRect(origin: CGPoint(x: 0, y: 0), size: imageSize)
        let renderer = UIGraphicsImageRenderer(size: imageSize)
        let img = renderer.image { ctx in
            UIColor.white.set()
    
            ctx.fill(imageRect)
            ctx.cgContext.rotate(by:CGFloat.pi / 2)
            ctx.cgContext.scaleBy(x: factor, y: -factor)
    
            ctx.cgContext.drawPDFPage(page)
        }
    
        return img
    }
    

    【讨论】: