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

如何用JavaScript在浏览器显示PDF字节数组、修复黑页及替代createObjectURL

PDF显示异常问题解决方案与优化建议

一、PDF内容全黑的修复方案

问题核心原因:jQuery的POST请求默认将响应内容解析为UTF-8字符串,原始二进制PDF数据被编码破坏,导致PDF阅读器仅能识别文件头获取页数,内容解码失败显示全黑。

修复步骤

仅需修改客户端AJAX请求配置,指定响应类型为二进制Blob即可,服务端代码无需调整:

// 修改后的请求部分代码
var result = $.post({
    url: url,
    type: 'POST',
    data: data,
    // 新增配置,指定响应为原始二进制Blob
    xhrFields: {
        responseType: 'blob'
    }
});

result.done(function (blob) {
    // 无需手动创建Blob,直接使用返回的二进制对象
    var link = window.URL.createObjectURL(blob);
    $("object").attr("data", link);
    // 加载完成后释放ObjectURL,避免内存泄漏
    $("object").on('load', () => {
        window.URL.revokeObjectURL(link);
    });
});

如果使用<object>标签仍有兼容性问题,可替换为<iframe>标签,用法完全一致,主流浏览器兼容性更好。

二、createObjectURL相关说明与优化方案

首先纠正认知误区:window.URL.createObjectURL本身并未废弃,仅传入MediaStream参数的用法被废弃,传入Blob的场景完全可以正常使用,只需注意加载完成后调用revokeObjectURL释放内存即可。

如果需要更简洁的实现方案,可根据场景选择以下方式:

  • 如果接口参数无敏感信息,可将服务端接口改为支持GET请求,直接将带参数的请求地址赋值给标签的data属性,完全不需要处理二进制逻辑:
    $("object").attr("data", `${url}?ID=@Model.DocID`);
    
    该方案性能最好,代码最简洁,也不存在内存泄漏问题。
  • 如果必须使用POST请求(如参数敏感不能外露),可选择Base64 DataURL方案:服务端将PDF字节数组转Base64字符串返回,客户端直接赋值即可:
    result.done(function (base64Str) {
        $("object").attr("data", `data:application/pdf;base64,${base64Str}`);
    });
    
    注意该方案会使数据体积增加33%,仅适合小体积PDF使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:48:03