Javascript 从api响应获取pdf文件
我正在调用一个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
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");
})