You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发求助:如何将叠加TextField文本的ImageView转为PDF?

嘿,我来帮你搞定这个需求!咱们一步步拆解,把文字叠到图片再转PDF的流程理清楚,顺便把代码补全,保证你能跑通~

第一步:先确认图片已经成功从第一个StoryBoard传过来

首先得确保第一个页面的图片已经正确传递到第二个ViewController,这是基础中的基础。如果还没做好,用prepare(for:sender:)方法来传:

// 第一个ViewController的代码
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let secondVC = segue.destination as? SecondViewController {
        // 替换成你第一个页面里要传递的ImageView
        secondVC.passedImage = yourFirstPageImageView.image
    }
}

// 第二个ViewController的代码
class SecondViewController: UIViewController {
    var passedImage: UIImage?
    @IBOutlet weak var targetImageView: UIImageView!
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 把传过来的图片赋值给当前页面的ImageView
        targetImageView.image = passedImage
    }
}
第二步:把TextField的文字叠加到图片上

这一步需要创建一个新的图片,把原图和文字绘制到同一个画布上。写个工具方法来做这个:

extension SecondViewController {
    func getImageWithOverlayText() -> UIImage? {
        guard let originalImage = targetImageView.image else { return nil }
        
        // 初始化画布,大小和原图一致
        let imageSize = originalImage.size
        UIGraphicsBeginImageContextWithOptions(imageSize, false, UIScreen.main.scale)
        originalImage.draw(at: .zero)
        
        // 绘制第一个TextField的文字,样式和位置可以自己调
        if let text1 = textField1.text, !text1.isEmpty {
            let textStyle: [NSAttributedString.Key: Any] = [
                .font: UIFont.systemFont(ofSize: 24),
                .foregroundColor: UIColor.white
            ]
            // 这里(20,20)是左上角偏移量,你可以改成你需要的位置
            text1.draw(at: CGPoint(x: 20, y: 20), withAttributes: textStyle)
        }
        
        // 绘制第二个TextField的文字,比如放在右下角
        if let text2 = textField2.text, !text2.isEmpty {
            let textStyle: [NSAttributedString.Key: Any] = [
                .font: UIFont.boldSystemFont(ofSize: 20),
                .foregroundColor: UIColor.black
            ]
            // 计算文字宽度,避免超出图片边界
            let textSize = text2.size(withAttributes: textStyle)
            let drawPoint = CGPoint(
                x: imageSize.width - textSize.width - 20,
                y: imageSize.height - textSize.height - 20
            )
            text2.draw(at: drawPoint, withAttributes: textStyle)
        }
        
        // 获取合成后的图片,结束画布上下文
        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        return finalImage
    }
}
第三步:把合成后的图片转成PDF

用PDFKit来完成转换,写个方法生成PDF并保存到本地(你也可以改成其他处理逻辑):

extension SecondViewController {
    func saveImageAsPDF(_ image: UIImage) {
        let pdfDoc = PDFDocument()
        let pdfPage = PDFPage(image: image)
        pdfDoc.insert(pdfPage!, at: 0)
        
        // 保存到Documents目录,方便查看
        guard let docsDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
        let pdfPath = docsDir.appendingPathComponent("result.pdf")
        
        if pdfDoc.write(to: pdfPath) {
            print("PDF生成成功!路径:\(pdfPath)")
            // 这里可以加个弹窗提示用户生成成功
        } else {
            print("PDF生成失败啦")
        }
    }
}
第四步:把流程绑定到Button点击事件

最后给第二个页面的按钮加点击事件,把所有步骤串起来:

// 第二个ViewController里的按钮点击方法
@IBAction func createPDFButtonTapped(_ sender: UIButton) {
    guard let finalImage = getImageWithOverlayText() else {
        print("没有图片或者文字为空哦")
        return
    }
    saveImageAsPDF(finalImage)
}
小提示
  • 如果需要更精准的文字排版,可以用draw(in:withAttributes:)方法,传入CGRect来控制文字的显示区域,避免文字超出图片范围。
  • 记得处理TextField为空的情况,比如用户没输入文字时,就直接用原图生成PDF。
  • 测试的时候可以用模拟器,然后通过Files app找到生成的PDF文件查看效果。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:35:46