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不生效有两个原因:
- 代码笔误:
PDFDocumentAttribute. titleAttribute的键名前多了一个多余空格,会导致键值匹配失败,属性无法正确写入 - 逻辑缺失:仅修改内存中
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
相关产品推荐
相关产品推荐

