Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能

Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能

需求:在pdf中鼠标滑动选中一段文字,将选中文字展示到input框中(pdf在iframe中)

完成效果:
显示效果
关于pdf的引用:我是直接当做静态资源引用的,有需要的call我。

第一步:将pdf.js文件放入static中
在这里插入图片描述

第二步:页面模板引入,使用iframe+view.html模板, /static/pdf/web/viewer.html是我文件夹中view.html的路径, pdf文件地址拼接在后面,例如:file=‘pdf地址’,我将地址存入了vuex中,防止页面刷新数据丢失(如果有跨域问题,肯定有的哈哈,让你的后端小哥给你做一下跨域处理,我前端做的Proxy代理。。。这篇文章不做过多解释,有问题留言,我给你私聊详解)

//pdf展示模板
			<template>
	          <iframe
	            width="100%"
	            height="100%"
	            :src="`/static/pdf/web/viewer.html?file=${$store.state.pdfUrl.slice(24)}`"
	            frameborder="0"
	            id="myIframe"
	          ></iframe>
	        </template>

第三步:写一个搜索框和一个按钮,用来输入或者滑选文字

		//展示框模板
		<el-row style="width:70%;margin-bottom:10px">
          <el-col :span="20">
            <el-input prefix-icon="el-icon-search" v-model="selectText" placeholder="搜索字段"></el-input>
          </el-col>
          <el-col :span="4">
            <el-button>查询</el-button>
          </el-col>
        </el-row>

这是搜索框绑定的你要搜索的内容

data () {
    return {
      // 展示框绑定选中的文本
      selectText: '',
      }

第四部:滑选事件注册和执行,获取滑选文字
注册在method中,在mounted中执行,iframe页面加载完成就开始监听是否触发滑选事件,并将触发后的选中文本传入到iframe对象中(iframe.contentWindow是iframe的window对象)

mounted () {
	let vm = this;
	//这是滑选事件
	vm.f();
}
methods: {
    // 滑选事件注册: 获取鼠标选中的文本
    f () {
      let vm = this;
      let iframe = document.getElementById('myIframe');
      let x = '';
      let y = '';
      let _x = '';
      let _y = '';
      // iframe 加载完成后执行并将双击事件过滤掉,因为双击事件可能也触发滑选,所以为了不误操作,将其剔除
      iframe.onload = function () {
      	// 鼠标点击监听
        iframe.contentDocument.addEventListener('mousedown', function (e) {
          x = e.pageX;
          y = e.pageY;
        }, true);
        //鼠标抬起监听
        iframe.contentDocument.addEventListener('mouseup', function (e) {
          _x = e.pageX;
          _y = e.pageY;
          if (x == _x && y == _y) return; //判断点击和抬起的位置,如果相同,则视为没有滑选,不支持双击选中
          var choose = iframe.contentWindow.getSelection().toString();
          console.log(choose);
          vm.selectText = choose;
        }, true);
      };
    },

到这里我们已经拿到了要搜索的内容,现在就差执行pdf.js的自带的搜索接口,我这里比较懒,直接调用的,所以各位大佬勿喷。上代码。
这里用到了postMessage(),因为iframe里嵌套了一个html,所以我要将数据传入到iframe中的html,这里的两个方法是注册在methods中,点击搜索之后触发。搜索就完成了。

    // 发送数据(搜索文字)
    sendMessage () {
      let vm = this;
      //获取iframe
      let iframe = document.getElementById('myIframe');
      //将滑选数据传入到iframe中
      iframe.contentWindow.postMessage(vm.selectText, '*');
    },
    // 接受数据
    getMessage () {
      //获取iframe
      let iframe = document.getElementById('myIframe');
      // iframe监听是否有数据传入,将传入的数据作为参数传递给pdf.js的find接口
      iframe.contentWindow.addEventListener('message', function (e) {
        //这里打印一下,看是否拿到了传入的数据
        console.log(e.data);
		// 这里打印的是pdf.js暴露出来的find接口
        console.log(iframe.contentWindow.PDFViewerApplication.findBar);
        // 输入查询数据
        iframe.contentWindow.PDFViewerApplication.findBar.findField.value = e.data;
        // 要求查询结果全体高亮
        iframe.contentWindow.PDFViewerApplication.findBar.highlightAll.checked = true;
        // 上面两部已经OK,触发highlightallchange方法。OK。全部完成,效果如文章开头,因为项目保密,所以就不这么着吧。
        iframe.contentWindow.PDFViewerApplication.findBar.dispatchEvent('highlightallchange');
      }, false);
    },
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
根据提供的引用内容,我们可以使用pdf.js插件来实现Vue2项目PDF预览功能,并且可以实现上一页和下一页的功能。具体步骤如下: 1.首先,我们需要在Vue2项目安装pdf.js插件。可以使用npm命令进行安装: ```shell npm install pdfjs-dist ``` 2.在Vue2项目创建一个PDFViewer.vue组件,并在该组件引入pdf.js插件: ```javascript import pdfjsLib from 'pdfjs-dist' ``` 3.在该组件,我们需要定义一个pdf对象来存储PDF文件的相关信息: ```javascript data() { return { pdf: null, currentPage: 1, totalPages: 0 } } ``` 4.接下来,我们需要编写一个方法来加载PDF文件并显示第一页: ```javascript loadPDF() { pdfjsLib.getDocument(this.pdfUrl).promise.then(pdf => { this.pdf = pdf this.totalPages = pdf.numPages this.renderPage(this.currentPage) }) }, renderPage(pageNumber) { this.pdf.getPage(pageNumber).then(page => { const canvas = this.$refs.canvas const context = canvas.getContext('2d') const viewport = page.getViewport(1.5) canvas.height = viewport.height canvas.width = viewport.width page.render({ canvasContext: context, viewport: viewport }) }) } ``` 5.在模板,我们需要添加一个canvas元素来显示PDF文件的内容,并添加两个按钮来实现上一页和下一页的功能: ```html <template> <div> <canvas ref="canvas"></canvas> <div> <button @click="prevPage">上一页</button> <button @click="nextPage">下一页</button> </div> </div> </template> ``` 6.最后,我们需要编写两个方法来实现上一页和下一页的功能: ```javascript prevPage() { if (this.currentPage > 1) { this.currentPage-- this.renderPage(this.currentPage) } }, nextPage() { if (this.currentPage < this.totalPages) { this.currentPage++ this.renderPage(this.currentPage) } } ``` 至此,我们就可以在Vue2项目使用pdf.js插件来实现PDF预览并实现上一页和下一页的功能了。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值