iOS 11下从HTML生成PDF时自定义字体及图片加载问题
问题根源验证
你的推测完全正确:UIMarkupTextPrintFormatter 处理本地资源的逻辑和WebView有本质区别。WebView会自动将相对路径映射到App包内的资源,但UIMarkupTextPrintFormatter没有这个自动解析能力——它只会按你提供的路径字面量去查找资源,相对路径对它来说等同于无效路径,自然无法加载字体和图片。
解决办法
核心思路是把所有包内资源的引用替换成绝对的file://开头的URL,让UIMarkupTextPrintFormatter能准确定位到资源文件。
1. 自定义字体加载修复
前置检查
首先确保字体已经正确加入项目:
- 字体文件(比如
AvenirLTStd-Black.otf)已添加到项目目录,且Target Membership已勾选对应App target - 在
Info.plist中添加Fonts provided by application字段,把字体文件名(如AvenirLTStd-Black.otf)加入数组
代码实现
在构造HTML的CSS时,用App包内的绝对URL替换相对路径:
// 获取字体的绝对文件URL guard let fontFilePath = Bundle.main.path(forResource: "AvenirLTStd-Black", ofType: "otf"), let fontFileURL = URL(fileURLWithPath: fontFilePath).absoluteString else { fatalError("无法找到目标字体文件") } // 构造包含绝对字体URL的HTML字符串 let htmlContent = """ <html> <head> <style> @font-face { font-family: 'AvenirLTStd-Black'; src: url('\(fontFileURL)') format('opentype'); font-weight: 900; font-style: normal; } body { font-family: 'AvenirLTStd-Black', sans-serif; } </style> </head> <body> <p>这是用自定义字体渲染的文本</p> </body> </html> """
2. 包内图片加载修复
和字体逻辑一致,把图片的相对路径替换成绝对file://URL:
// 获取图片的绝对文件URL guard let imageFilePath = Bundle.main.path(forResource: "yourImage", ofType: "png"), let imageFileURL = URL(fileURLWithPath: imageFilePath).absoluteString else { fatalError("无法找到目标图片文件") } // 在HTML中使用绝对URL引用图片 let imageHtmlSegment = "<img src=\"\(imageFileURL)\" alt=\"包内图片\" width=\"200\" height=\"200\">"
最终整合使用
把处理好的HTML字符串传入UIMarkupTextPrintFormatter即可:
let printFormatter = UIMarkupTextPrintFormatter(markupText: htmlContent) // 后续执行PDF生成逻辑(如通过UIPrintPageRenderer渲染)
额外注意事项
- 字体格式要和
format()参数匹配:OTF用opentype,TTF用truetype - 确保所有资源文件的大小写和代码中的文件名一致(iOS文件系统区分大小写)
- 如果使用Asset Catalog管理图片,需要先把图片导出到本地目录,或者用
UIImage转成Data再嵌入HTML(但绝对URL方式更简单)
内容的提问来源于stack exchange,提问作者Vitalii Boiarskyi
相关产品推荐
相关产品推荐

