关于vue预览pdf的记录(vue-pdf,pdf.js,iframe标签)

最近项目要生成一个电子协议pdf,然后再前端实现预览操作,最开始图方便直接用了vue-pdf插件,但是这个插件很坑,下文会详细记录,后来又用iframe标签直接显示pdf文件,这个标签能显示项目内的pdf文件,对应后端返回的pdf文件流却无法直接显示。但我这项目后端只能返回文件流的形式,所以没办法,继续找方法,最终用pdf.js实现了改功能。

一.vue-pdf

1.首先安装

npm install --save vue-pdf

2.在项目中引用

        完整代码如下:

<template>
    <div>
         <pdf :src="src" ref="myPdfComponent"></pdf>
    </div>
</template>
<script>
import pdf from 'vue-pdf'
import CMapReaderFactory from 'vue-pdf/src/CMapReaderFactory.js'
export default {
  components:{
      pdf,
      CMapReaderFactory
  },
  data(){
      return {
        src: '',
      }
  },
  methods:{
    
  },
  mounted(){
        this.$http.get('/xxxx/xxxx/xxx/xxx/'+'xxx').then((res) =>{
            if(res.data.code == 0){
            //对后端返回的base64编码进行去空格处理
            var base64 ='data:application/pdf;base64,' + res.data.data.replace(/[\r\n]/g, "");
            //解决部分汉字不显示问题
            this.src = pdf.createLoadingTask({ url: base64, CMapReaderFactory });
            
            }
        }).catch(() => {})
    }
}
</script> 
<style>
</style>

第一次显示pdf效果如下:

再次访问该页面,展示pdf效果如下:

 会发现,pdf中的汉字消失了,效果跟没有执行下面这行代码一模一样

 //解决部分汉字不显示问题
this.src = pdf.createLoadingTask({ url: base64, CMapReaderFactory });

 但是我在这代码后面加了console.log(“=====”)输出发现代码都有执行,总不会是这行代码没执行,而后面却能输出再控制台吧,查了一些网上的资料,没有看到我这类似的问题的,没办法之后换方法了。

二.iframe

关于iframe的介绍大家可以自行bd,我直接说我在项目中的使用。

首先你把一个pdf文件放在项目中(如下图的demo.pdf)

 然后直接再iframe标签中用src指向这demo.pdf文件即可显示

<iframe src="/demo.pdf" width="100%" height="760" frameborder= '1'></iframe>

注:在这个项目中“/”代表的是“public”文件夹,

但是我用后端返回的base64编码放到src属性下,它就显示不了

所以需要用到pdf.js插件。

三.pdf.js

1.下载pdf.js插件:Getting Started (mozilla.github.io)

下载后解压文件 :

然后把这几个文件加放到项目的public或者static文件夹下

使用的时候配合<iframe>一起使用,直接将标签的src属性指向pdf.js插件的 viewer.html页面,让该页面代为展示pdf即可

 完整代码如下:

<template>
    <div>
      <iframe :src="'/pdfjs/web/viewer.html?file='+url"  width="100%" height="760"  border="0"></iframe>  
    </div>
</template>
<script>
export default {
  components:{
  },
  data(){
      return {
        id:this.$route.params.id,
        url:'',//pdf文件路径
      }
  },
  methods:{
  },
  mounted(){
    this.$http.get('/xxxx/xxxx/xxxx/xxxx/',{responseType: 'blob'}).then(response  => {
        if (!response) {
            return this.$message.error("查看电子协议失败,请联系管理员");
        }
        //将文件流转为成blob地址预览pdf文件
        let blob = new Blob([response.data],{type: 'application/pdf;charset=UTF-8'});
        //创建url
        let href = window.URL.createObjectURL(blob); 
        this.url = encodeURIComponent(href);
      }).catch(() => {})  
    }
}
</script> 
<style>
</style>

 展示结果如下:

 完成项目要求!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue项目中,可以使用pdf.js预览pdf文件。有几种方法可以实现这一功能。 第一种方法是利用浏览器自带的预览功能,你可以通过在Vue组件中使用iframe标签来实现。在Vue组件中,你可以定义一个pdfUrl变量来存储pdf文件的地址,然后将该地址作为iframe标签的src属性值。这样,当Vue组件渲染时,iframe标签会加载并显示pdf文件。具体代码如下: ```html <template> <iframe ref="mainiframe" :src="pdfUrl" style="height:100%;width:100%"></iframe> </template> <script> export default { data() { return { pdfUrl: "http://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf" // 替换成你的pdf文件地址 }; } }; </script> ``` 第二种方法是利用pdf.js库封装一个Vue组件来实现在线pdf查看。你可以将pdf.js库引入到Vue项目中,并创建一个自定义的Vue组件来处理pdf文件的加载和显示。具体代码如下: ```html <template> <div> <canvas ref="pdfCanvas"></canvas> </div> </template> <script> import pdfjsLib from "pdfjs-dist"; export default { mounted() { this.loadPdf(); }, methods: { async loadPdf() { const pdfUrl = "http://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf"; // 替换成你的pdf文件地址 const pdf = await pdfjsLib.getDocument(pdfUrl).promise; const page = await pdf.getPage(1); const canvas = this.$refs.pdfCanvas; const context = canvas.getContext("2d"); const viewport = page.getViewport({ scale: 1 }); canvas.height = viewport.height; canvas.width = viewport.width; const renderContext = { canvasContext: context, viewport: viewport }; await page.render(renderContext); } } }; </script> ``` 以上是两种在Vue项目中预览pdf文件的方法,你可以根据自己的需求选择适合的方法来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vue项目中预览pdf文件](https://blog.csdn.net/prey1025/article/details/90029284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值