使用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
相关产品推荐
相关产品推荐

