vue实现pdf展示绘制和标注功能以及锚点功能

我真是服气了,为了实现pdf标注和绘制功能,搜索了大量文章,发现都要很多文章最后都要收费,而且是通过一个博主在多个平台发布的文章,这个功能有这么难么?
在经过一番折腾后,这是绘制和文字功能都是pdf自带的工具,根本不需要二次开发,我的这个工具栏没有这个功能原来是因为用了老版本的pdf.js。下面来对比一下新版老版的区别
新版本


image.png

老版本

image.png

如果大家只是简单的实现pdf预览功能可以使用老版本,如果要实现绘制和标注,一定要下载新版本


image.png

2,锚点功能
pdf的锚点功能需要通过文字搜索来实现


image.png
  <a-input-search v-model:value="selectText" style="margin-bottom: 8px" placeholder="Search"  @change="sendMessage" />
<iframe :src="'/pdf/web/viewer.html?file=' + `/ceshi2.pdf`" height="100%"  width="100%"
                                id="myIframe" />
mounted() {
        //这是滑选事件
        this.getSelectText();
        // 搜索时 接收数据
        this.getMessage()
        
    },
 methods: {
        // 滑选事件注册: 获取鼠标选中的文本
        getSelectText() {
            let _this = 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();
                    _this.selectText = choose;
                }, true);
            };
        },

        // 发送数据(搜索文字)
        sendMessage() {
            let vm = this;
            //获取iframe
            let iframe = document.getElementById('myIframe');
            //将滑选数据传入到iframe中
            debugger
            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);

        },

    },
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容