从服务器加载 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
以避免内存泄漏。
我有一个 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
以避免内存泄漏。