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

Swift使用OData返回的二进制数据创建PDF出现文件损坏怎么办

故障排查与解决方法

  • 校验原始二进制数据格式
    正常PDF文件前4字节固定为0x25 0x50 0x44 0x46(对应ASCII字符%PDF),你可以先打印接收到的gDocumentOutputData前4位做校验,如果不匹配说明OData返回的数据本身不是原生二进制,大概率是被做了Base64编码,需要先解码再生成文件,这是这类问题最常见的诱因。
  • 校验数据长度匹配性
    确认gDocBinarySize和OData接口返回的Content-Length数值完全一致,Data(bytes:count:)构造器对长度精度要求极高,多/少1字节都会生成损坏的文件。
  • 优化写入逻辑
    写入时增加.atomic参数,避免写入过程中进程中断导致文件不完整,同时确认文件名后缀为.pdf,避免系统隐式格式处理异常。

优化后代码示例

if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first{
    // 强制添加.pdf后缀避免格式识别错误
    let fileURL = dir.appendingPathComponent(im_filename).appendingPathExtension("pdf")
    print(fileURL)
    do{
        let pdfData = Data(bytes: gDocumentOutputData, count: gDocBinarySize)
        // 可选:PDF头校验
        if pdfData.count >= 4 {
            let header = pdfData.prefix(4)
            if header != Data([0x25, 0x50, 0x44, 0x46]) {
                print("原始数据非标准PDF二进制,若为Base64编码需先解码")
                // 若确认是Base64编码,取消下一行注释做解码
                // guard let decodedData = Data(base64Encoded: pdfData) else { return }
                // 后续使用decodedData写入即可
            }
        }
        // 增加atomic写入选项保障文件完整性
        try pdfData.write(to: fileURL, options: .atomic)
    }catch{
        print("写入失败:\(error.localizedDescription)")
    }
}

问题场景截图

问题场景截图

内容的提问来源于stack exchange,提问作者Praveer's Wanderlust

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:39:03