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

Swift中如何修改PDFKit生成PDF内的链接颜色?

解决PDFKit生成PDF时链接颜色无法修改的问题

当你通过text.draw(at:withAttributes:)添加带link属性的文本时,PDFKit会优先使用系统默认的链接样式(蓝色),直接覆盖你设置的foregroundColor属性。要解决这个问题,需要分开处理文本样式和链接交互:先绘制自定义颜色的文本,再手动给文本区域添加可点击的PDF链接。

修改后的完整代码

guard let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {
    fatalError("Cannot find document directory")
}
let url = documentsPath.appendingPathComponent("\(pdfTitle).pdf")

let pdfRenderer = UIGraphicsPDFRenderer(bounds: view.bounds)
hideTextView()

do {
    try pdfRenderer.writePDF(to: url, withActions: { context in
        context.beginPage()
        view.layer.render(in: context.cgContext)
        
        // 1. 定义纯文本样式(黑色、下划线、字体),不包含link属性
        let textAttributes = [
            NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14),
            NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue,
            NSAttributedString.Key.foregroundColor: UIColor.black
        ] as [NSAttributedString.Key : Any]
        
        // 2. 绘制黑色带下划线的文本
        text.draw(at: textViewOrigin, withAttributes: textAttributes)
        
        // 3. 计算文本占据的矩形区域
        let textSize = text.size(withAttributes: textAttributes)
        let linkRect = CGRect(origin: textViewOrigin, size: textSize)
        
        // 4. 给文本区域添加可点击的PDF链接
        if let linkUrl = URL(string: "mailto:\(text)") {
            context.addLink(to: linkUrl, rect: linkRect)
        }
    })
} catch {
    print("Could not create PDF file: \(error)")
}

关键说明

  • 先绘制不带link属性的文本,确保foregroundColor和underlineStyle完全生效,显示为你需要的黑色带下划线样式。
  • 调用context.addLink(to:rect:)方法,给文本对应的矩形区域绑定URL链接,这样既保留了自定义文本样式,又实现了点击跳转功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:14:54