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

使用GAS网页应用通过Drive API下载PDF出现空白页问题求助

问题原因与修复方案

问题出在前端创建Blob的方式错误:直接将atob解码后的字符串传入Blob构造函数,会导致二进制数据被错误地按UTF-8文本编码处理,破坏了PDF文件的原始二进制结构,最终打开后内容空白。

错误点分析

atob(response)返回的是ASCII格式的字符串,而PDF属于二进制文件,必须以字节数组的形式传递给Blob构造函数,才能保留正确的二进制数据结构。

修复后的前端代码

function getPDF(){
    google.script.run.withSuccessHandler(function(response){
      $("#overlay").hide(); 
      
      let decoded = atob(response);
      // 将解码后的字符串转换为Uint8Array字节数组
      let uint8Array = new Uint8Array(decoded.length);
      for (let i = 0; i < decoded.length; i++) {
        uint8Array[i] = decoded.charCodeAt(i);
      }
      
      let blob = new Blob([uint8Array], {type: "application/pdf"}); // 传入字节数组构建Blob

      const objectUrl = URL.createObjectURL(blob);

      const link = document.createElement('a')
      link.setAttribute('href', objectUrl)
      link.setAttribute('download', "test.pdf")
      link.style.display = 'none'

      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      // 释放URL对象,避免内存泄漏
      URL.revokeObjectURL(objectUrl);
      
    }).downloadPDF();
}

补充说明

  • GAS端代码无需修改,Utilities.base64Encode(response.getContent())的处理是正确的,它将Drive API返回的二进制内容编码为base64字符串传递给前端。
  • 修复核心是把atob得到的字符串转换成Uint8Array,确保Blob使用原始二进制数据构建,这样生成的PDF文件就能正常显示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:10:22