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); }); ### 三、完整代码如下

相关推荐
汉得数字平台1 天前
汉得H-AI飞码——前端编码助手V1.1.2正式发布:融业务知识,提开发效能
前端·人工智能·智能编码
前端小万1 天前
Jenkins 打包崩了?罪魁是 package.json 里的 ^
前端·jenkins
编程小白gogogo1 天前
苍穹外卖前端环境搭建
前端
shuaijie05181 天前
当表格数据量过大的时候,如何使用不分页进行展示
javascript·vue.js·ecmascript
光影少年1 天前
web端安全问题有哪些?
前端·安全
行走的陀螺仪1 天前
Vite & Webpack 插件/Loader 封装完全指南
前端·webpack·node.js·vite·前端工程化·打包构建
1024肥宅1 天前
浏览器网络请求 API:全面解析与高级封装(1)
前端·websocket·axios
小费的部落1 天前
Excel 在Sheet3中 匹配Sheet1的A列和Sheet2的A列并处理空内容
java·前端·excel
小易吾1 天前
VISIO导出高清PDF有效方法
笔记·pdf
霍格沃兹测试学院-小舟畅学1 天前
Cypress 入门与优势分析:前端自动化测试的新利器
前端