从 ERP (weclapp) 的 API 调用中下载在 Javascript 中进行 FlateDecoded 的 PDF

Download a PDF received from an API call from ERP (weclapp) that is FlateDecoded in Javascript

我打算通过 API 电话接收 pdf 以直接下载。 我得到的结果如下所示:

%PDF-1.4
%����
4 0 obj
<</Filter/FlateDecode/Length 983>>stream
x��Xo�0Է<ѭC�:�H�]`
����ڍ��֕n"$�

我需要做什么才能下载这个?我在 vuejs/axios 作为前端工作,并打算使用 express 作为后端。

我在这里发现了一个类似的问题,但没有解决方案:Download PDF file from api using javascript IE9 我实现了代码,但生成的弹出窗口只是保持白色

通常它似乎是带有 FlateDecode-filter 的 pdf。

我有这个实用程序可以从 API url 下载文件。

import axios from "axios";

/**
 * utility to download a File from an api url.
 * @param config (optional) config for axios
 */
export default function download(url, config) {
  return axios.get<Blob>(url, {
    ...config,
    responseType: "blob"
  }).then(response => {
    // get filename from content-disposition header
    const contentDisposition = response.headers["content-disposition"];
    const fileName = contentDisposition.match(/\bfilename=([^;]*)/)[1].trim();
    
    //"save" file to hard disk
    const link = document.createElement("a");
    link.href = URL.createObjectURL(response.data);
    link.setAttribute("download", fileName);
    document.body.appendChild(link);
    link.click();

    // cleanup
    setTimeout(() => {
      link.parentNode.removeChild(link);
    }, 3000);

    return response;
  })
}

所以我在这个线程中找到了这个有效的答案:https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743

似乎有很多不同的方法可以解决这个问题。

  await this.$axios( this.api_url, 
    {method: 'GET', responseType: 'blob', headers: {"AuthenticationToken": this.api_token} }
    ).then(response => {
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement('a');
    link.href = url;
    // works in IE11
    if (typeof window.navigator.msSaveBlob === 'function') {
      window.navigator.msSaveBlob(
        response.data,
        `${filename}.pdf`
      );
    } else {
      link.setAttribute('download', `filename.pdf`);
      document.body.appendChild(link);
      link.click();
    }
});