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

Chrome报错Failed to load PDF document但接口返回数据正常如何解决

问题根因

你遇到的PDF加载失败是因为new Blob接收的内容不是合法的PDF原始字节,分为两种常见情况:

  1. 后端返回的JSON结构中data.Content是Base64编码的PDF内容,直接将Base64字符串传入Blob会导致内容损坏
  2. jQuery ajax默认将响应按UTF-8转成字符串,破坏了二进制PDF的原始字节结构

解决方案

场景A:后端返回JSON包装的Base64格式PDF

先添加Base64转二进制数组的工具函数:

function base64ToUint8Array(base64: string): Uint8Array {
    const binaryStr = window.atob(base64);
    const bytes = new Uint8Array(binaryStr.length);
    for (let i = 0; i < binaryStr.length; i++) {
        bytes[i] = binaryStr.charCodeAt(i);
    }
    return bytes;
}

修改原有创建Blob的代码:

// 替换原有let blob = new Blob(...) 行
const pdfBytes = base64ToUint8Array(data.Content);
let blob = new Blob([pdfBytes], { type: data.ContentType });

场景B:后端直接返回PDF二进制流

修改$.ajax配置,要求直接返回Blob类型响应,禁止jQuery自动转码:

printItems(versionKeys: string[]): JQueryPromise<any> {
    console.log('printItems');
    $.ajax({
        type: "post",
        contentType: "application/json",
        data: JSON.stringify(versionKeys),
        url: this.apiUrls.PrintTemplates,
        // 新增以下两个配置项
        xhrFields: {
            responseType: 'blob'
        },
        processData: false,
        success: function (blob, status, xhr) {
            const url = URL.createObjectURL(blob);
            // 替换window.open避免弹窗拦截,可选
            const a = document.createElement('a');
            a.href = url;
            a.target = '_blank';
            a.download = '打印文件.pdf';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            console.log('success');
        }
    });
    return;
}

验证方法

修改后在控制台打印生成的Blob的size属性,和后端实际PDF文件大小对比,数值一致则说明Blob生成正确,即可正常加载PDF。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:24:04