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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:52:06