从服务器加载 pdf 并嵌入到 Vue 应用程序中

Load pdf from server and embed in Vue app

我有一个 api 其中 returns 一个 pdf 文件。我试图在 vue.js 中显示它,并找到了 vue-pdf 组件,它看起来应该可以完成这项工作。 Here's the project on github

我可以调用 API 并获得二进制响应,但我无法将二进制数据转换为 vue-pdf 库可以显示的内容。

The documentation for the :src prop is here

下面是我的 vue 代码,其中一些失败的尝试已被注释掉。

<template>
  <pdf :src="pdfsrc"></pdf>
</template>

<script>
import pdf from "vue-pdf";
import axios from "axios";

export default {
  components: {
    pdf
  },
  data() {
    return {
      pdfsrc: null
    };
  },
  created() {
    return axios
      .get(`${process.env.VUE_APP_API_INTRANET}/pdf`, {
        responseType: "application/pdf"
      })
      .then(response => {
        console.log("Success", response);
       
       // 1
       // this.pdfsrc = new Blob([response.data]);
       
       // 2
       //this.pdfsrc = response.data;
       
       //3
       //   for (var i = 0; i < response.data.length; ++i) {
        //   this.pdfsrc.push(response.data.charCodeAt(i) & 0xff);
        //   }

        //4
        this.pdfsrc = new Uint8Array(response.data);
      })
      .catch(console.error); //
  }
};
</script>

我意识到,对于我的示例,我可以将 src 设置为 api 的 URL,但最终它需要授权 headers 添加和链接 OAuth 调用,因此它需要成为 api 电话。

我还想将 pdf 与来自另一个 api 调用的一些数据并排显示,因此使用动态创建加载数据的锚标记和 .click() 'ing it won' 的技巧不适合我。

首先将您预期的 responseType 更改为“blob”:

return axios.get(`${process.env.VUE_APP_API_INTRANET}/pdf`, {
  responseType: "blob"
})

同时将二进制响应转换为 Blob and then generate an object url:

.then(response => {
  console.log("Success", response);
  const blob = new Blob([response.data]);
  const objectUrl = URL.createObjectURL(blob);
  this.pdfsrc = objectUrl;
})

完成后不要忘记使用 revokeObjectURL 以避免内存泄漏。