Javascript 从api响应获取pdf文件

Javascript 从api响应获取pdf文件,javascript,node.js,api,pdf,Javascript,Node.js,Api,Pdf,我正在调用一个api并得到pdf作为回报 fetch(`api` + guid, { method: "GET", headers: { "Accept": "application/octet-stream", "Authorization": "Bearer " + token, }, responseType: 'arraybuffer', }) .t

我正在调用一个api并得到pdf作为回报

fetch(`api` + guid, {
   method: "GET",
   headers: {
    "Accept": "application/octet-stream",
    "Authorization": "Bearer " + token,
   },
   responseType: 'arraybuffer',
})
.then((res) => res.text())
.then((data) => {
    fs.writeFileSync('file.pdf', data);
});
pdf响应如下所示:

%PDF-1.5
%����

1 0 obj
<</Type /Catalog
/Pages 2 0 R>>
endobj

2 0 obj
<</Type /Pages
/Kids [3 0 R]
/Count 1>>
endobj

4 0 obj
<</Length 5 0 R
/Filter /FlateDecode>>
stream
x��W[S�F~��8/�mX�~a�P��L�4C�H�����Ȃ�_׿ֳ�%���$0�t.߹}{�a�4�R�B&�N9�U���ҏn~��I+m�#�9
���䂃�%'�Q�X�0.�L��1�h1i�Xk�7|.��_�^��|�.<��:-�5?�F����1;؊�li)�� m��7�9�CX��MU�D��C5�|�V�4�=q�́
��:��0~�������8E�����S�M=���+qƪA�J�(�Q���_>�S���J�
��z��1D��N�bo�)�C5�sux�k1o��cD�X��Jq��_�1�_�j�Zc�TlKP{
响应标题:

Headers {
   [Symbol(map)]: [Object: null prototype] {
     'content-length': [ '44049' ],
     'content-type': [ 'application/octet-stream' ],
     'content-disposition': [
       "attachment; filename=invoice-694.pdf; filename*=UTF-8''invoice-694.pdf"
     ],
     'x-xss-protection': [ '1; mode=block' ],
     'x-content-type-options': [ 'nosniff' ],
     'x-frame-options': [ 'DENY' ],
     'x-robots-tag': [ 'noindex, nofollow' ],
     'access-control-allow-headers': [ 'Origin, X-Requested-With, Content-Type, Accept' ],
     'access-control-allow-methods': [ 'GET, PUT, POST, OPTIONS, DELETE' ],
     'strict-transport-security': [ 'max-age=31536000; includeSubdomains' ],
     date: [ 'Tue, 17 Nov 2020 10:18:05 GMT' ],
     via: [ '1.1 google' ],
     'alt-svc': [ 'clear' ],
     connection: [ 'close' ]
   }
 }
我发现了类似的问题,但没有一个解决方案适合我

如果有人能指出这个问题,那就太好了。

我发现了这个问题。 因为我使用的是fetch而不是Axios。 我们无法将responseType作为Fetch的选项传递

fetch(`api` + guid, {
   method: "GET",
   headers: {
    "Accept": "application/octet-stream",
    "Authorization": "Bearer " + token,
   },
   // responseType: 'arraybuffer' //#1 remove this,
})
相反,响应本身可以作为arraybuffer传递,如下所示

.then((res) => res.arraybuffer())
而不是

.then((res) => res.text())
现在不再直接使用响应来编写我们的pdf文件。我们可以将数据更改为base64字符串,然后再次解码以创建pdf文件。我使用了base64ToPdfnpm包来处理这个问题

.then(data => {
  var base64Str = Buffer.from(data).toString('base64');
  base64.base64Decode(base64Str, "file.pdf");
})
我希望这对其他人有帮助。:)

将res.arraybuffer()更改为res.arraybuffer()
下面是webdriverio的工作代码-
变量头={
授权:“持票人”+accessToken,
接受:'application/pdf'
}
取回(
阿皮乌尔,
{
标题:{
接受:“应用程序/八位字节流”,
授权:“持票人”+accessToken
},
},
)
。然后((res)=>{
如果(!res.ok){
返回res.status.toString()
}
return res.arrayBuffer()
})
。然后((数据)=>{
var base64Str=Buffer.from(data.toString('base64');
base64.base64Decode(base64Str,文件名);
})
.接住(
(错误)=>{
返回错误消息;
})

base64是什么?我发现这个错误“base64”没有定义编辑是一个npm包
const base64=require('base64topdf')@YogeshBhattarai我刚刚安装了base64topdf软件包,在使用base64.base64Decode时,我收到一个错误信息“fs.writeFileSync不是函数”。你有过类似的问题吗?我没有解决这个问题,我只是找到了另一个例子,如何从响应中获取pdf,一切都很好。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。
.then(data => {
  var base64Str = Buffer.from(data).toString('base64');
  base64.base64Decode(base64Str, "file.pdf");
})