导出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
相关产品推荐
相关产品推荐

