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

导出PDF时如何避免UITextView内容被栅格化?

如何让TextKit 2的UITextView渲染PDF时保留可编辑文本而非栅格化?

我在将UIView渲染为PDF时,需要确保文本元素保留为可编辑的实际文本,而非被栅格化为位图。当前使用的是基于TextKit 2的UITextView和NSTextLayoutManager提供内容,但无论如何操作,UITextView都会被栅格化。

基础实现代码如下:

let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)

let data = renderer.pdfData { (context) in
    for page in self.pageViews {
        context.beginPage()
        let cgContext = context.cgContext               
        page.layer.render(in: cgContext)
    }
}

页面视图中的UITextView采用了复杂布局,无法直接将其内容转换为单个NSAttributedString后绘制到CoreText上下文。

目前针对UILabel有一个可行技巧:直接在当前上下文绘制,就能让它以非栅格化的文本形式渲染到PDF中。有趣的是,当通过NSTextAttachmentViewProvider为使用TextKit 2的文本视图提供UILabel时,文本视图内的UILabel不会被栅格化——此时PDF中的UILabel文本是可选中的矢量文本,而非位图。

这说明实际被栅格化的是文本片段而非整个视图,验证后确实如此。枚举文本片段并直接在上下文绘制,就能让文本保留为实际文本而非位图:

page.textView?.textLayoutManager?.enumerateTextLayoutFragments(from: location, options: [.ensuresLayout, .estimatesSize, .ensuresExtraLineFragment], using: { fragment in
    let frame = fragment.layoutFragmentFrame
    fragment.draw(at: frame.origin, in: cgContext)
    return true
})

但这种方式存在两个问题:

  • 布局坐标不受UITextView约束,使用自定义NSTextLayoutFragment类时问题会更严重
  • 文本附件无法正常绘制,只会显示扭曲的占位图标

我想知道:有没有办法让UITextView和NSTextLayoutManager像UILabel一样绘制内容,使PDF中的文本片段保留为实际文本而非位图?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:15:05