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

Swift iOS开发中修改下载PDF文件名称的实现方法

问题描述
  • 从API端点成功下载PDF文件后,PDF默认标题为PDF document.pdf,需要修改该PDF的标题
  • 尝试使用PDFDocumentAttribute更新PDF metadata未生效,尝试代码如下:
var metadata = pdfDocument.documentAttributes!
metadata[PDFDocumentAttribute.subjectAttribute] = "subject attribute"
metadata[PDFDocumentAttribute. titleAttribute] = "title attribute"
pdfDocument.documentAttributes = metadata
  • 补充说明:实现过程未使用FileManager
  • 当前获取PDF的实现代码:
let task = session.dataTask(with: urlRequest) { (data, _, error) in
    DispatchQueue.main.async {
        guard let unwrappedData = data, error == nil else {
            completion(.failure(error ?? Constants.dummyError))
            return
        }

        guard let pdfDocument = PDFDocument(data: unwrappedData) else {
            completion(.failure(error ?? Constants.dummyError))
            return
        }

        completion(.success(pdfDocument))
    }
}
解决方案

修改metadata不生效有两个原因:

  1. 代码笔误:PDFDocumentAttribute. titleAttribute的键名前多了一个多余空格,会导致键值匹配失败,属性无法正确写入
  2. 逻辑缺失:仅修改内存中PDFDocument实例的属性后,没有将变更重新序列化为PDF数据,所有属性修改只会停留在临时内存中,不会持久化生效

修正后的核心实现代码如下:

let task = session.dataTask(with: urlRequest) { (data, _, error) in
    DispatchQueue.main.async {
        guard let unwrappedData = data, error == nil else {
            completion(.failure(error ?? Constants.dummyError))
            return
        }

        guard let pdfDocument = PDFDocument(data: unwrappedData) else {
            completion(.failure(error ?? Constants.dummyError))
            return
        }

        // 初始化/修改元数据,不要强制解包避免无属性字典时崩溃
        var metadata = pdfDocument.documentAttributes ?? [:]
        metadata[PDFDocumentAttribute.subjectAttribute] = "subject attribute"
        metadata[PDFDocumentAttribute.titleAttribute] = "自定义PDF标题"
        pdfDocument.documentAttributes = metadata

        // 关键步骤:将修改完属性的文档重新转为Data,生成最终生效的PDF实例
        guard let updatedPdfData = pdfDocument.dataRepresentation(),
              let finalPdfDoc = PDFDocument(data: updatedPdfData) else {
            completion(.failure(Constants.dummyError))
            return
        }

        completion(.success(finalPdfDoc))
    }
}

注意事项

  • 不要强制解包documentAttributes,部分源PDF本身不带内置属性字典,强制解包会触发运行时崩溃,用空字典作为默认值即可
  • 如果后续需要将PDF保存到本地,直接使用updatedPdfData写入对应本地路径即可,本地保存的PDF会自动携带设置好的标题属性,不会再显示默认的PDF document.pdf
  • 如果使用PDFView、WKWebView等组件展示PDF,传入更新后的finalPdfDoc实例即可正常读取到自定义标题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:36:29