使用JavaScript和Node.js(流星)以递归方式获取PDF发票

尼古拉·阿列什科夫斯基(Nikolay Aleshkovskiy)

我们正在开发具有Recurly集成的应用程序,并尝试使用它的PDF Invoice功能。

该应用程序基于Node.js(流星平台)。

它使用二进制文件从Recurly接收正确的答案:

递归地

但是我无法正确保存它。我尝试了两种方法:在浏览器的客户端上打印它:

var file = window.URL.createObjectURL(new Blob([r.content], {type: "application/pdf"}));
  var a = document.createElement("a");
  a.href = file;
  a.download = "invoicePDF";
  document.body.appendChild(a);
  a.click();

  window.onfocus = function () {
   document.body.removeChild(a)
  }

并将其直接保存在服务器上(仅用于测试):

var fs = require('fs');
var wstream = fs.createWriteStream('C:/recurly.pdf');
wstream.write(result.content);
wstream.end();

但是在两种情况下,我最终都无法使用pdf文件。Acrobat,Foxit阅读器和Chrome无法打开此文件-已损坏。

你有什么建议我错了吗?也许我需要先进行一些内容转换,然后再保存它或进行其他操作?

添加

我已将此请求发送给客户端并打印在控制台中(上图)。

try {
      result = HTTP.call(
        'GET',
        'https://' + Meteor.settings.recurly.SUBDOMAIN + '.recurly.com/v2/invoices/' + invoiceId,
        {
          headers: {
            Authorization: "Basic " + (new Buffer(Meteor.settings.recurly.API_KEY)).toString('base64'),
            Accept: 'application/pdf'
          }
        }
      );
    } catch (err) {
      result = e;
    }
MasterAM

问题是您正在尝试获取一个带有请求的二进制文件,该请求期望将编码的字符串作为响应。

最好的选择是告诉请求库它应该期待什么,否则,您将不得不手动从UTF-16-或UTF-8-encoded字符串中撬出二进制数据

客户端和服务器实现之间有区别。


服务器

服务器实现使用节点的request模块。你可以它为供应选择使用npmRequestOptions

如其文档中所述:

encoding-用于响应数据的setEncoding的编码。如果为null,则将正文作为Buffer返回。其他任何内容(包括默认值undefined)都将作为编码参数传递给toString()(这意味着默认情况下它实际上是utf8)。注意:如果需要二进制数据,则应将编码设置为:null。

因此,在服务器上,您可以执行以下操作:

try {
  result = HTTP.call(
    'GET',
    'https://' + Meteor.settings.recurly.SUBDOMAIN + '.recurly.com/v2/invoices/' + invoiceId,
    {
      headers: {
        Authorization: "Basic " + (new Buffer(Meteor.settings.recurly.API_KEY)).toString('base64'),
        Accept: 'application/pdf'
      },
      npmRequestOptions: {
        encoding: null // will cause the result to be stored in a binary Buffer
      }
    }
  );

  // will write the file in binary mode
  fs.writeFile(outFileName, res.content, 'binary');
} catch (err) {
  result = e;
}

客户

客户端实现使用XHR。

为了处理二进制响应,您需要将XHR更改responseType为(最好是)'blob'

不幸的是,我看不到Meteor当前HTTP包实现中的二进制blob,因为它希望响应包含一个responseText

您可以直接使用XMLHttpRequest对象,但可能需要添加一些包装程序代码以支持即将死去的浏览器(IE6,我在看着您!-通常是new ActiveXObject('Microsoft.XMLHttp');跳舞)。

这可以使用以下代码来实现:

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.setRequestHeader('Authorization', ...);
xhr.responseType = 'blob'; // this is key

xhr.onload = function(e) {
  if (this.status == 200) {
    // this.response is a Blob. If you are sure that it is of the
    // correct content-type, you can use it to construct the URL directly
    let blob = new Blob([this.response], {type: 'application/pdf'});
    let url = URL.createObjectURL(blob);
    let a = document.createElement("a");
    a.href = url;
    a.download = "invoice.pdf";
    document.body.appendChild(a);
    ...
  }
};

xhr.send();

它发送一个XHR,该XHR将响应编码为二进制Blob,并生成带有正确数据的ObjectURL。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用JavaScript和Node.js(流星)以递归方式获取PDF发票

来自分类Dev

从Magento发票pdf中删除运输方式和付款方式

来自分类Dev

使用Node.js从Firebase上传和获取PDF

来自分类Dev

递归-获取发票PDF(pdf字符串中的pdf)

来自分类Dev

安装和使用Node JS

来自分类Dev

安装和使用Node JS

来自分类Dev

提取价格,然后使用javascript和node注册价格以获取变量?

来自分类Dev

使用JavaScript和Node.js创建多语言网站

来自分类Dev

使用Node.js和Google&Javascript进行OAuth 2登录

来自分类Dev

我可以同时使用JavaScript和TypeScript开发Node.js(Express)应用程序吗?

来自分类Dev

在客户端和Node.js服务器上使用静态JavaScript文件

来自分类Dev

如何使用Node.js和zlib要求或评估gzip压缩的JavaScript文件?

来自分类Dev

使用 Node.js、Socket.IO 和 Express 提供静态 JavaScript 文件

来自分类Dev

我如何使用node.js获取所有网页资源?例如图片,CSS表格和javascript

来自分类Dev

Node.js Javascript和Express

来自分类Dev

Node.js和JavaScript入门

来自分类Dev

JavaScript Promise和Node.js

来自分类Dev

Node.js和JavaScript入门

来自分类Dev

Node.js Javascript和Express

来自分类Dev

获取javascript(和Node.js)中GET请求的结果

来自分类Dev

使用Node.js以编程方式运行JavaScript

来自分类Dev

如何在使用node.js和vanilla javascript制作的Web应用程序中使用代理?

来自分类Dev

使用nginx和node获取IP用户

来自分类Dev

使用Node.js和Java异步获取MQTT数据

来自分类Dev

使用node.js和mongoose的mapReduce

来自分类Dev

使用Node JS和MongoDB过滤查询

来自分类Dev

Netbeans和Node.js使用

来自分类Dev

使用 `replace` 和 Node.js 函数

来自分类Dev

什么是|| 字符代表Javascript吗?实际上我将其与Node.js和Passport一起使用

Related 相关文章

  1. 1

    使用JavaScript和Node.js(流星)以递归方式获取PDF发票

  2. 2

    从Magento发票pdf中删除运输方式和付款方式

  3. 3

    使用Node.js从Firebase上传和获取PDF

  4. 4

    递归-获取发票PDF(pdf字符串中的pdf)

  5. 5

    安装和使用Node JS

  6. 6

    安装和使用Node JS

  7. 7

    提取价格,然后使用javascript和node注册价格以获取变量?

  8. 8

    使用JavaScript和Node.js创建多语言网站

  9. 9

    使用Node.js和Google&Javascript进行OAuth 2登录

  10. 10

    我可以同时使用JavaScript和TypeScript开发Node.js(Express)应用程序吗?

  11. 11

    在客户端和Node.js服务器上使用静态JavaScript文件

  12. 12

    如何使用Node.js和zlib要求或评估gzip压缩的JavaScript文件?

  13. 13

    使用 Node.js、Socket.IO 和 Express 提供静态 JavaScript 文件

  14. 14

    我如何使用node.js获取所有网页资源?例如图片,CSS表格和javascript

  15. 15

    Node.js Javascript和Express

  16. 16

    Node.js和JavaScript入门

  17. 17

    JavaScript Promise和Node.js

  18. 18

    Node.js和JavaScript入门

  19. 19

    Node.js Javascript和Express

  20. 20

    获取javascript(和Node.js)中GET请求的结果

  21. 21

    使用Node.js以编程方式运行JavaScript

  22. 22

    如何在使用node.js和vanilla javascript制作的Web应用程序中使用代理?

  23. 23

    使用nginx和node获取IP用户

  24. 24

    使用Node.js和Java异步获取MQTT数据

  25. 25

    使用node.js和mongoose的mapReduce

  26. 26

    使用Node JS和MongoDB过滤查询

  27. 27

    Netbeans和Node.js使用

  28. 28

    使用 `replace` 和 Node.js 函数

  29. 29

    什么是|| 字符代表Javascript吗?实际上我将其与Node.js和Passport一起使用

热门标签

归档