vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果

TOC\]![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1056756dbaaf4f1a8139d051f4d497f7.png) ### 一、文件预览 #### 1、安装依赖包 这里安装了disjs-dist@2.16版本,安装过程中报错缺少worker-loader > npm i pdfjs-dist@2.16.105 worker-loader@3.0.8 #### 2、模板部分 #### 3、js部分(核心) 核心代码如下: 1. 利用 PDF.getDocument获取pdf基础数据 2. 通过canvas将pdf渲染到canvas画布上 ##### 可能出现的问题: (1) 页面文字可选中,但文本不可见 通过测试发现,将 pdfjs-dist/web/pdf_viewer.css 路径下的 color 属性注释后可显示文本。 .textLayer span, .textLayer br { /* color: transparent; */ position: absolute; white-space: pre; cursor: text; transform-origin: 0% 0%; } ##### pdf多页面处理 1. 模板处理id作为唯一标识 2. 修改canvas渲染逻辑,主要通过递归的方式逐一渲染 renderPage(num) { this.pdfDoc.getPage(num).then((page) => { const canvas = document.getElementById(`page-${num}`); const ctx = canvas.getContext("2d"); const viewport = page.getViewport({ scale: this.pdfScale }); canvas.width = viewport.width; canvas.height = viewport.height; const renderContext = { canvasContext: ctx, viewport, }; page.render(renderContext); if (num < this.pdfPages) { this.renderPage(num + 1); } }); }, ### 二、文本选中与弹窗(核心代码) Promise.all([getTextContentPromise, renderPagePromise]) .then(([textContent]) => { const textLayerDiv = document.createElement("div"); // 注意:此处不要修改该元素的class名称,该元素的样式通过外部导入,名称是固定的 textLayerDiv.setAttribute("class", "textLayer"); // 设置容器样式 textLayerDiv.setAttribute( "style", ` z-index: 1; opacity: .2; // background-color:#fff; // transform: scale(1.1); width: 100%, height: 100%, `, ); // 设置容器的位置和宽高 textLayerDiv.style.left = canvas.offsetLeft + "px"; textLayerDiv.style.top = canvas.offsetTop + "px"; textLayerDiv.style.height = canvas.offsetHeight + "px"; textLayerDiv.style.width = canvas.offsetWidth + "px"; const textView = document.querySelector("#text-view"); textView.appendChild(textLayerDiv); const textLayer = new TextLayerBuilder({ // container: , textLayerDiv: textLayerDiv, pageIndex: page.pageIndex, viewport: viewport, eventBus, // textDivs: [] }); textLayer.setTextContent(textContent); textLayer.render(); // 当选择文本后鼠标取消点击时触发 textLayerDiv.addEventListener("mouseup", () => { // // 隐藏文本层 // textLayerDiv.style.display = 'none'; // 是否选择了文本 const isTextSelected = window.getSelection().toString().trim() !== ""; if (isTextSelected) { //选择的文本内容 const selectedText = window.getSelection().toString(); console.log("Selected text:", selectedText); if (selectedText) { alert(selectedText); } } }); }) .catch((error) => { console.error("Error rendering page:", error); }); ### 三、完整代码如下

相关推荐
美狐美颜sdk4 小时前
跨平台直播美颜sdk集成攻略:Android、iOS与Web的统一方案
android·前端·ios
Airser4 小时前
npm启动Taro框架报错
前端·npm·taro
Anlici5 小时前
连载小说大学生课设 需求&架构
前端·javascript·后端
乘风!5 小时前
前端Jquery,后端Java实现预览Word、Excel、PPT,pdf等文档
pdf·word·excel·jquery
2501_938769996 小时前
React Server Components 进阶:数据预取与缓存
前端·react.js·缓存
我有一棵树6 小时前
浏览器使用 <embed> 标签预览 PDF 的原理
pdf·embed
蒜香拿铁6 小时前
Angular【基础语法】
前端·javascript·angular.js
xiaoxiao无脸男7 小时前
纯css:一个好玩的按钮边框动态动画
前端·css·css3
rookie_fly7 小时前
基于Vue的数字输入框指令
前端·vue.js·设计模式
元直数字电路验证7 小时前
ASP.NET Core Web APP(MVC)开发中无法全局配置 NuGet 包,该怎么解?
前端·javascript·ui·docker·asp.net·.net