You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Swift中如何将UIImage生成的PDF适配到PDFView中?

嘿,这个问题我熟!我来给你捋捋怎么让PDF完美适配PDFView的尺寸~

核心解决方案:利用PDFView内置的自动缩放属性

其实iOS的PDFView已经提供了现成的适配能力,不用手动计算复杂的缩放比例,只需要几个关键设置就能搞定:

1. 开启自动缩放(最关键一步)

设置PDFViewautoScales属性为true,它会自动计算合适的缩放比例,让PDF页面适配视图的宽度(或高度,取决于内容和显示模式),完全不用你自己算数值。

2. 配置显示模式与自适应布局

根据你的需求选择displayMode

  • .singlePageContinuous:连续滚动显示单页,适合长内容浏览
  • .singlePage:一次只显示一页,类似电子书的单页阅读模式
    同时要确保PDFView能跟随父视图的尺寸变化,比如设置autoresizingMask或者用Auto Layout约束让它铺满父视图,这样旋转屏幕时也能自动适配。

3. 生成PDF时保证页面尺寸合理

如果转出来的PDF页面和图片尺寸不匹配,可能会出现多余空白或拉伸问题,所以生成PDF时尽量用图片的实际尺寸作为PDF页面的尺寸,从源头避免适配隐患。

完整代码示例

结合你提到的imagePickerController选中图片的场景,我给你写一套完整的可运行代码:

第一步:图片转PDF的工具函数

func convertImageToPDF(_ image: UIImage) -> Data? {
    // 可选:设置PDF元数据
    let pdfMeta = [
        kCGPDFContextCreator: "你的应用名称",
        kCGPDFContextAuthor: "开发者名称"
    ] as CFDictionary
    
    // 用图片的实际尺寸创建PDF页面
    let imageFrame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
    let pdfData = NSMutableData()
    
    guard let pdfContext = CGContext(pdfData as CFMutableData, mediaBox: &imageFrame, pdfMeta) else {
        print("创建PDF上下文失败")
        return nil
    }
    
    // 绘制图片到PDF页面
    pdfContext.beginPDFPage(nil)
    if let cgImage = image.cgImage {
        pdfContext.draw(cgImage, in: imageFrame)
    }
    pdfContext.endPDFPage()
    pdfContext.closePDF()
    
    return pdfData as Data
}

第二步:配置并显示适配后的PDFView

func setupAndShowPDFView(with pdfData: Data) {
    let pdfView = PDFView()
    
    // 让PDFView铺满当前ViewController的view(可根据你的布局调整)
    pdfView.frame = view.bounds
    pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    
    // 核心适配设置
    pdfView.autoScales = true
    pdfView.displayMode = .singlePageContinuous // 按需切换为.singlePage
    pdfView.pageBreakMargins = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16) // 可选:调整页面边距
    
    // 加载PDF文档
    if let pdfDoc = PDFDocument(data: pdfData) {
        pdfView.document = pdfDoc
    }
    
    view.addSubview(pdfView)
}

第三步:在imagePickerController回调中调用

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true)
    
    // 获取选中的图片
    guard let selectedImage = info[.originalImage] as? UIImage else {
        print("未获取到选中的图片")
        return
    }
    
    // 图片转PDF
    guard let pdfData = convertImageToPDF(selectedImage) else {
        print("图片转PDF失败")
        return
    }
    
    // 显示适配后的PDF
    setupAndShowPDFView(with: pdfData)
}
额外注意点
  • 如果你的PDFView是用Auto Layout布局的,记得给它添加leading、trailing、top、bottom的约束,绑定到父视图,这样视图大小变化时(比如旋转屏幕)PDFView能自动调整,配合autoScales实现完美适配。
  • 如果后续需要支持多图片转多页PDF,autoScales依然能生效,每个页面都会自动缩放到适合视图的尺寸。

内容的提问来源于stack exchange,提问作者johnDoe

火山引擎 最新活动