• VUE预览PDF文件并利用pdf.js获取鼠标选中的文字和搜索,在iframe中获取选中文字,监听鼠标事件,右键菜单


    一、VUE预览PDF文件并利用pdf.js获取鼠标选中的文字和搜索

    需求实现:vue实现预览pdf文件,获取到鼠标选中的文字数据。调用pdf.js自带的搜索方法实现搜索功能(后期可以调用该接口满足其他的搜索需求)

     1、下载pdf.js插件

    地址: Getting Started

     

    下载后解压文件放置在public文件夹下

     2、在页面中引入

    1. //搜索框和搜索按钮
    2. <div style="margin-bottom:10px">
    3. <el-input prefix-icon="el-icon-search" v-model="selectText">el-input>
    4. <el-button type="primary" @click="sendMessage">搜索el-button>
    5. div>

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

    1. //pdf展示模板
    2. <div class="iframe_box">
    3. <iframe width="100%" height="100%" :src="`/pdf/web/viewer.html?file=${pdfUrl}`" frameborder="0" id="myIframe">iframe>
    4. div>

     使用的是本地pulic文件夹下的pdf文件

    1. data:{
    2. return{
    3. pdfUrl: "/2.pdf", //pdf地址
    4. selectText: "",//搜索框中的文本
    5. }
    6. }

    3、获取选中文本,实现搜索

    1. mounted() {
    2. //这是滑选事件
    3. this.getSelectText();
    4. // 搜索时 接收数据
    5. this.getMessage()
    6. },

    在mounted中执行事件,iframe页面加载完成就开始监听是否触发滑选事件,并将触发后的选中文本传给搜索框(iframe.contentWindow是iframe的window对象) 

    1. // 滑选事件注册: 获取鼠标选中的文本
    2. getSelectText() {
    3. let _this = this;
    4. let iframe = document.getElementById('myIframe');
    5. let x = '';
    6. let y = '';
    7. let _x = '';
    8. let _y = '';
    9. // iframe 加载完成后执行并将双击事件过滤掉,因为双击事件可能也触发滑选,所以为了不误操作,将其剔除
    10. iframe.onload = function () {
    11. // 鼠标点击监听
    12. iframe.contentDocument.addEventListener('mousedown', function (e) {
    13. x = e.pageX;
    14. y = e.pageY;
    15. }, true);
    16. // 鼠标抬起监听
    17. iframe.contentDocument.addEventListener('mouseup', function (e) {
    18. _x = e.pageX;
    19. _y = e.pageY;
    20. if (x == _x && y == _y) return; //判断点击和抬起的位置,如果相同,则视为没有滑选,不支持双击选中
    21. var choose = iframe.contentWindow.getSelection().toString();
    22. _this.selectText = choose;
    23. }, true);
    24. };
    25. },

    点击搜索按钮后像iframe发送数据,在mouted中接收数据。 

    1. // 发送数据(搜索文字)
    2. sendMessage() {
    3. let vm = this;
    4. //获取iframe
    5. let iframe = document.getElementById('myIframe');
    6. //将滑选数据传入到iframe中
    7. iframe.contentWindow.postMessage(vm.selectText, '*');
    8. },
    9. // 接受数据
    10. getMessage() {
    11. //获取iframe
    12. let iframe = document.getElementById('myIframe');
    13. // iframe监听是否有数据传入,将传入的数据作为参数传递给pdf.js的find接口
    14. iframe.contentWindow.addEventListener('message', function (e) {
    15. //这里打印一下,看是否拿到了传入的数据
    16. console.log(e.data);
    17. // 这里打印的是pdf.js暴露出来的find接口
    18. console.log(iframe.contentWindow.PDFViewerApplication.findBar);
    19. // 输入查询数据
    20. iframe.contentWindow.PDFViewerApplication.findBar.findField.value = e.data;
    21. // 要求查询结果全体高亮
    22. iframe.contentWindow.PDFViewerApplication.findBar.highlightAll.checked = true;
    23. // 上面两部已经OK,触发highlightallchange方法。OK。全部完成,效果如文章开头,因为项目保密,所以就不这么着吧。
    24. iframe.contentWindow.PDFViewerApplication.findBar.dispatchEvent('highlightallchange');
    25. }, false);
    26. },

    参考文章关于vue预览pdf的记录(vue-pdf,pdf.js,iframe标签)_Renyun_的博客-CSDN博客

    Vue项目中利用pdf.js实现pdf内容滑选文字展示与搜索功能_十二指禅的博客-CSDN博客

    二、在iframe中注册鼠标右键菜单, 销毁菜单,获取iframe选中的文字

    需求实现:选中文字后,右击显示菜单打开弹窗,获取到选中的文字。单击鼠标时,菜单栏消失

     1、使用vue-contextmenujs ,在methods中实现注册菜单和销毁菜单的方法

    关于vue-contextmenujs 的使用  VUE右键菜单 vue-contextmenujs的使用_ZMJ_QQ的博客-CSDN博客

    1. //注册菜单
    2. onContextmenu(event) {
    3. event.preventDefault()
    4. this.$contextmenu({
    5. items: [
    6. {
    7. icon: "el-icon-circle-plus-outline",
    8. label: "添加标签",
    9. onClick: () => {
    10. this.addTagVisible = true;
    11. }
    12. },
    13. ],
    14. event,
    15. //菜单显示X坐标, 存在event则失效
    16. // x: event.clientX, //x轴坐标
    17. // y: event.clientY, //y轴坐标
    18. customClass: "class-a",
    19. zIndex: 3,
    20. minWidth: 100
    21. });
    22. return false;
    23. },
    24. //销毁菜单
    25. contextmenuDestory() {
    26. this.$contextmenu.destroy();
    27. },

    2、改写iframe的加载方法,监听鼠标抬起时,将获取到选中文字赋值给弹窗中。在iframe中自定义鼠标右键事件。

        因为我的菜单位置有问题,查找后发现vue-contextmenujs中,使用的是event.cilentX,该字段是只读的,可通过 Object.defineProperty。。重新设值,如果菜单位置正常则可忽略

    注册完右键菜单后,如果不添加菜单销毁事件,则菜单栏会一直停留在页面上,需要在单击事件中销毁菜单。

    1. // 滑选事件注册: 获取鼠标选中的文本
    2. getSelectText() {
    3. let _this = this;
    4. let iframe = document.getElementById('myIframe');
    5. let x = '';
    6. let y = '';
    7. let _x = '';
    8. let _y = '';
    9. // iframe 加载完成后执行并将双击事件过滤掉,因为双击事件可能也触发滑选,所以为了不误操作,将其剔除
    10. iframe.onload = function () {
    11. // 鼠标点击监听
    12. iframe.contentDocument.addEventListener('mousedown', function (e) {
    13. x = e.pageX;
    14. y = e.pageY;
    15. }, true);
    16. // 鼠标抬起监听
    17. iframe.contentDocument.addEventListener('mouseup', function (e) {
    18. _x = e.pageX;
    19. _y = e.pageY;
    20. if (x == _x && y == _y) return; //判断点击和抬起的位置,如果相同,则视为没有滑选,不支持双击选中
    21. var choose = iframe.contentWindow.getSelection().toString();
    22. console.log(choose);
    23. _this.selectText = choose;
    24. //给弹窗中的字段辅助
    25. _this.tagform.tag = choose;
    26. }, true);
    27. // 自定义鼠标右键事件
    28. iframe.contentWindow.oncontextmenu = function (event) {
    29. if (_this.tagform.tag) {
    30. //重新设置菜单位置,如果菜单位置正常可忽略
    31. Object.defineProperty(event, 'clientX', {
    32. value: event.screenX,
    33. writable: true,
    34. configurable: true,
    35. enumerable: true,
    36. });
    37. //重新设置菜单位置,如果菜单位置正常可忽略
    38. Object.defineProperty(event, 'clientY', {
    39. value: event.screenY - 100,
    40. writable: true,
    41. configurable: true,
    42. enumerable: true,
    43. });
    44. // alert('请不要点击鼠标右键!');
    45. _this.onContextmenu(event)
    46. return false;//组织浏览器右键
    47. }
    48. };
    49. iframe.contentWindow.onclick = function () {
    50. _this.contextmenuDestory()
    51. }
    52. };
    53. },

    参考文章:在iframe中获取选中的数据/iframe中鼠标事件_Flyfish2058的博客-CSDN博客_iframe 鼠标移动事件

  • 相关阅读:
    类似东郊到家上门按摩小程序/包括商家入驻、服务查询、订单管理、用户评价等
    C语言-函数
    第二章 第八节:列表的增删改查
    jdbc不能使用占位符代表表名及其解决方法
    Windows11重置提示找不到恢复环境怎么解决?
    windows系统装成Ubuntu或linux后,无线/有线网卡无法连接或找不到适配器
    Spring Boot文档目录
    Angular RouterModule.forRoot(ROUTES) 和 forChild(ROUTES)的区别
    PHP 生成微信小程序码,并存储图片
    sql建库,建表基础操作
  • 原文地址:https://blog.csdn.net/ZMJ_QQ/article/details/126875978