使用 blob 在浏览器中下载 PDF

Download PDF in browser with blob

我不太清楚如何从 google 电子表格 PDF 导出 Web 链接下载 PDF。我为此案例生成了一个测试电子表格。

我知道我需要为 blob 实现 encodeURIComponent and/or "Buffer.from" 但无论我怎么做,它只会为我下载损坏的 PDF。

这是我目前最原始的形式。感谢您的支持!

节点 JS:

const fetch = require('node-fetch');

var url = "https://docs.google.com/spreadsheets/d/1fLjKASR_g5wsvOjjJi6RclqMVd2o_1On-OfimXtId4E/export?exportFormat=pdf&format=pdf&size=A4&fzr=true&gid=477517973&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&portrait=true&fitw=true&fith=true&top_margin=0.20&bottom_margin=0.20&left_margin=0.20&right_margin=0.20";

let blob = await fetch(url).then(r => r.blob());

// then send blob variable to javascript 

Javascript:

function downloadURI(name) {
        var uri = 'data:application/pdf;base64,' + blob; 
        var link = document.createElement('a');
        link.download = name;
        link.href = uri;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        delete link;
      }
      downloadURI("test"+".pdf")

我认为从var uri = 'data:application/pdf;base64,' + blob;在你的脚本中,在这种情况下,需要将下载的数据转换为base64。虽然我不确定Node JS:Javascript:之间的脚本之间的关系,但在你的情况下,下面的修改怎么样?

发件人:

let blob = await fetch(url).then(r => r.blob());

收件人:

let buf = await fetch(url).then((r) => r.arrayBuffer());
const data = Buffer.from(buf).toString("base64");

这样,您就可以使用data如下。

var uri = 'data:application/pdf;base64,' + data;

注:

  • 作为附加信息,例如,如果您只想使用 Javascript 将电子表格下载为 PDF 文件,您还可以使用以下脚本。但是,在这种情况下,电子表格需要公开共享。请注意这一点。

      async function downloadURI(name) {
        var url = "https://docs.google.com/spreadsheets/d/1fLjKASR_g5wsvOjjJi6RclqMVd2o_1On-OfimXtId4E/export?exportFormat=pdf&format=pdf&size=A4&fzr=true&gid=477517973&sheetnames=false&printtitle=false&pagenumbers=false&gridlines=false&portrait=true&fitw=true&fith=true&top_margin=0.20&bottom_margin=0.20&left_margin=0.20&right_margin=0.20";
    
        let blob = await fetch(url).then((r) => r.blob());
        var f = new FileReader();
        f.readAsDataURL(blob);
        f.onload = d => {
          var uri = d.target.result;
          var link = document.createElement('a');
          link.download = name;
          link.href = uri;
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
          delete link;
        }
      }
      downloadURI("test"+".pdf")