通过网络应用下载Apps脚本生成的PDF

时间:2017-03-22 15:19:15

标签: pdf encoding google-apps-script character-encoding

我试图找出如何将Google Apps脚本部署为网络应用程序,以下载点击后生成的PDF。它几乎可以工作,但生成的文件不是有效的。我无法弄清楚它是否是编码问题或其他原因。

在Apps脚本中,代码看起来很简单:

---
title: "test"
output:
  html_document: 
    css: test.css
---

在浏览器中,有一个点击处理程序:

function makePDF() {
   ...
   var pdfBlob = doc.getAs('application/pdf');
   return Utilities.base64Encode(pdfBlob.getBytes());
}

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我想通了,所以如果其他人试图将PDF从Apps脚本传递到客户端javascript,则发布答案。这比我做的简单得多。

不要乱用base64编码,只需传回字节数组:

function makePDF() {
 ...
 var pdfBlob = DocumentApp.openById('1234').getAs('application/pdf');
 return pdfBlob.getBytes();
}

现在,在客户端,从ArrayBuffer构造一个新的Blob。这也很简单:

function clickHandler(ev) {
  google.script.run
  .withSuccessHandler(function(data) {
    var arr = new Uint8Array(data);
    var blob = new Blob([arr.buffer], {type: 'application/pdf'});

    var obj_url = window.URL.createObjectURL(blob);

    var hiddenLink = document.getElementById('hiddenPDFLink');
    hiddenLink.setAttribute('href', obj_url);
    hiddenLink.setAttribute('download', 'filename.pdf');
    hiddenLink.click();
  })
  .makePDF();
}

就是这样!希望其他人认为这有用。

答案 1 :(得分:0)

我假设你的makePDF函数正在做一些其他的东西/计算,最后你需要把这个文件下载到本地计算机。

你可以做的是内部成功处理程序

var link = document.querySelector('#hiddenLink');
link.href = "https://docs.google.com/feeds/download/documents/export/Export?id=**TheIdOfDocumenToBeDownloaded**&exportFormat=pdf";
link.click();

然后它会提示您将文档保存到本地计算机。