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

Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能「建议收藏」Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能//pdf展示模板 <template> <iframe width=”100%” height=”100%” :src=”`/static/pdf/web/viewer.html?file=${$store.state.pdfUrl.slice(24)}`” frameborder=”0″

大家好,欢迎来到IT知识分享网。

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);
    },

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/26009.html

(0)
上一篇 2023-04-16 11:00
下一篇 2023-04-24 16:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信