利用postMessage实现pdf.js关键字个数查找

xiaoxiao2021-02-28  33

需求:外部输入关键字,去查找预览出来的pdf文件中的关键字个数,返回到外部进行alert出来

解决: 使用postMessage进行监听

因为,pdf.js工具自带

代表着 中国金融 这个关键字在 此文档中出现 了 14次,

首先当然是找到这个方法啦,viewer.js一万多行源码啊,现在就可以开始了,

外面vue页面的input框触发change方法

<el-input v-model.trim="account.signatureKeyword" @change="checkKeyword(account.signatureKeyword, indexs, index)" :disabled="editFlag && editStatus"></el-input>

因为我这边用到了双层循环,所以需要带里外index,进行精确保存

checkKeyword (val, indexs, index) { if (val.trim()) { let obj = { value: val, index: indexs, supIndex: index } this.sendMessage(obj) } }, sendMessage (msg) { document.getElementById('previewPdf').contentWindow.postMessage(msg, '*') }, bindEvent (element, eventName, eventHandler) { if (element.addEventListener) { // addEventListener support for IE8 element.addEventListener(eventName, eventHandler, false) } else if (element.attachEvent) { element.attachEvent('on' + eventName, eventHandler) } },

在 viewer.js中找到自带触发的那个查询方法

bindEvent(window, 'message', function (e) { var _index = e.data.index; var _supIndex = e.data.supIndex; _this.findField.value = e.data.value; _this.highlightAll.checked = true; _this.dispatchEvent('highlightallchange'); setTimeout(function () { var result = document.getElementById('findResultsCount').innerText; var _obj = { result: result, index: _index, supIndex: _supIndex }; sendMessage(_obj); }, 400); });

这里进行postmessage进行监听再传递出去,注意执行查询自带的查询方法,获得准确的关键字个数是需要时间的,具体不甚了解,只是打印出来发现了这个原因,so给了一个延时,上面的方法封装

var bindEvent = function (element, eventName, eventHandler) { if (element.addEventListener) { element.addEventListener(eventName, eventHandler, false); } else if (element.attachEvent) { element.attachEvent('on' + eventName, eventHandler); } }; var sendMessage = function (msg) { // Make sure you are sending a string, and to stringify JSON window.parent.postMessage(msg, '*'); };

这样关键字和 关键字个数就这样一起可以被外部监听得到 

外部vue文件的created的钩子函数下写,进行保存到变量中,保存的时候,这样关键字变化,我这里利用双向绑定实时更新!

this.bindEvent(window, 'message', (e) => { if (e.data) { if (e.data.result) { this.manageFormData.signatureOpponent[e.data.supIndex].sealIdList[e.data.index].signatureKeywordNumber = Number(e.data.result) } else if (e.data.result === '') { this.manageFormData.signatureOpponent[e.data.supIndex].sealIdList[e.data.index].signatureKeywordNumber = 0 } } })

实际效果,我将保存改为直接alert出来

这里加2个链接,关于postMessage的,帮助了我很多,希望对大家也有用。

1   https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

2   https://gist.github.com/pbojinov/8965299

转载请注明原文地址: https://www.6miu.com/read-2620441.html

最新回复(0)