当前位置: 代码网 > it编程>编程语言>Javascript > vue如何使用pdf.js实现在线查看pdf文件功能

vue如何使用pdf.js实现在线查看pdf文件功能

2024年05月18日 Javascript 我要评论
需求:有一个列表页,用户点击查看,弹层展示后台接口返回的pdf内容(不是文件、地址之类的,乱码的pdf铭文(二进制文件流))1、pdf.js安装npm install --save vue-pdf2、

需求:

有一个列表页,用户点击查看,弹层展示后台接口返回的pdf内容(不是文件、地址之类的,乱码的pdf铭文(二进制文件流))

1、pdf.js安装

npm install --save vue-pdf

2、正文代码

<template>
    <div>
		<el-table :data="datalist">
	        <el-table-column prop="fieldname" width="120" label="操作">
	          <template slot-scope="scope">
	            <span @click="look(scope.row)">查看</span>
	          </template>
	        </el-table-column>
       </el-table>
	   <el-dialog title="预览" :visible.sync="dialogvisible" :before-close="closepdf">
      	 <pdf v-for="i in numpages" :key="i" :src="pdfsrc" :page="i" />
       </el-dialog>
	</div>
<template>
<script>
	import pdf from 'vue-pdf'
	export default {
	  components: {
	    pdf
	  },
	  data() {
   		 return {
  		 	  dialogvisible: false,
		      numpages: 1,
		      pdfsrc:"",
		      close:false,
   		 }
   	  },
   	  methods: {
		// 查看预览
	    look(row) {
	      const that = this;
	      that.pdfsrc = "";
		  // 接口文件地址(接口入参拼出来的路径)
	      const url = `${host}xxxxxx/xxxx/xxx?fileid=${row.fileid}&amp;filename=${row.filename}.pdf`;
		  // 如果调用接口(接口的responsetype一定要是blob,默认json,不然解析出来的pdf是空白的)后拿的返回的值(乱码的pdf铭文(二进制文件流))则需要转一下
		  // const url = window.url.createobjecturl(new blob([res]), { // res为接口返回值
			// type: "application/msword"
		  // });
	      that.pdfsrc = pdf.createloadingtask(url)
	      that.pdfsrc.promise.then(pdf => {
	        that.dialogvisible = true;
	        that.numpages = pdf.numpages
	        //保证pdf加载成功,否则不能关闭弹层
	        settimeout(() => {
	          that.close = true;
	        }, 2000);
	      })
	      .catch(error => {
	        that.$message.error("无效的pdf文件!");
	      })
	    },
	    //此方法解决第一次查看pdf文字没有加载完成影响后续查看
	    closepdf(done){
	      if(this.close) {
	        this.numpages = 1;//必须重置,多次查看会出现头部内容缺失
	        this.close = false;
	        done();
	      } else {
	        this.$message.warning("pdf文件加载中");
	      }
	    }
	  }
	}
</script>

遇到的问题:

1、多次查看后头部内容不显示。 设置numpages = 1;

2、上一条pdf查看没有加载完成,下一条pdf查看pdfsrc清空了还是无法正常加载。 延迟关闭弹层(这个方法有点暴力,希望能找到好的解决方法);

3、头部会有点多余内容溢出,内容没啥,就是感觉有类似border的东西。 头部其他内容设置样式盖住(具体css略)。

在后续项目中又实现了该功能,没有遇到以上问题,盲猜是因为pdf dialog标签上加了v-if,光设置visible.sync只会控制元素的显示隐藏,不会重新渲染。

总结:只要是dialog最好加上v-if,会避免很多问题。

拓展:

如果后端返回的是html格式,前端调用的接口responsetype就不要用blob了,直接将返回结果放在v-html里面。例:

<div v-html="responsedata"/>

总结 

到此这篇关于vue如何使用pdf.js实现在线查看pdf文件功能的文章就介绍到这了,更多相关vue在线查看pdf文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com