情况一
如果后端返回的pdf地址,粘贴到浏览器的url框中,可以在浏览器中直接进行预览的,那么我们就用window.open,或 a标签,或iframe标签通过设置src进行预览即可
法1:可以直接使用window.open('获取到的pdf地址')重新打开一个浏览器页签
通过浏览器页签直接实现预览功能(预览页面的样式,根据浏览器的不同,会略有差异)
法2:使用iframe标签
<iframe :src="获取到的pdf预览地址></iframe>
法3:使用a标签,也可设置跳转一个新窗口
<a :href="获取到的pdf预览地址></a>
情况二
后端返回了服务器文件pdf的地址,粘贴到浏览器的url框中,无法在浏览器中直接进行预览,或者是直接进行了下载,这种情况,上述方法解决不了,需要使用插件或者设置浏览器请求头的方式来解决
法1:使用vue-pdf进行预览
(1)安装:
npm install --save vue-pdf
(2)引入:在要使用的vue页面进行引入
import pdf from 'vue-pdf'
并引入组件
components: { pdf }
(3)使用:
单页pdf可以直接使用
<pdf>:src="获取到的pdf地址"
</pdf>
多页pdf通过循环实现
<pdfv-for="item in pageTotal":src="pdfUrl":key="item":page="item"
>
</pdf>
data中定义:
data(){return{pageTotal: null,pdfUrl: "http://101.34.220.192:9000/emergency-response/integration/system_manual/RESOURCE1689663612812.pdf"}
}
// 获取pdf总页数getTotal() {// 多页pdf的src中不能直接使用后端获取的pdf地址 否则会按页数请求多次数据// 需要使用下述方法的返回值作为urlthis.pdfUrl = pdf.createLoadingTask(this.pdfUrl)// 获取页码this.pdfUrl.promise.then(pdf => this.pageTotal = pdf.numPages).catch(error => { })},
此时就可以正常预览:
法2:不使用插件,使用get请求,修改请求头类型来实现
定义一个函数:
openPdf(url) {return new Promise((resolve, reject) => {let blob = null;let xhr = new XMLHttpRequest();xhr.open("GET", 'http://101.34.220.192:9000/emergency-response/integration/system_manual/RESOURCE1689663612812.pdf');xhr.responseType = "blob";xhr.onload = () => {blob = xhr.response;const blobob = new Blob([blob], { type: 'application/pdf;charset=utf-8' });const href = window.URL.createObjectURL(blobob);window.open(href, 'newWindow');resolve(file);};xhr.onerror = (e) => {reject(e)};xhr.send();});},
使用:
<a href="" @click="openPdf('http://101.34.220.192:9000/emergency-response/integration/system_manual/RESOURCE1689663612812.pdf')" target="_blank">预览文档</a>