PC端pdfJs實現(xiàn)預覽pdf并且可復制

要求預覽pdf,同時實現(xiàn)可復制功能。

首先使用pdfJs方法,生成pdf數(shù)據(jù)。

下載  npm i pdfjs-dist --s "pdfjs-dist": "^2.2.228",
引入 import pdfjsLib from 'pdfjs-dist'
使用 previewPDF() { //生成pdf數(shù)據(jù)
            //配置基本參數(shù)
            let protocol = document.location.protocol;//獲取當前的網(wǎng)絡協(xié)議
            let pdfBaseUrl = this.pdfBaseUrl; //獲取當前pdf請求的URL
            let pdf_protocol = pdfBaseUrl.split('//')[0]; //截取當前pdf請求的URL,獲取協(xié)議
            if(protocol !== pdf_protocol) { //當前項目的協(xié)議跟查看pdf的協(xié)議不一樣的時候要替換協(xié)議,不替換協(xié)議會出現(xiàn)跨域問題
                pdfBaseUrl = pdfBaseUrl.replace('http:',protocol);//替換http協(xié)議為當前協(xié)議
            }
            pdfjsLib.GlobalWorkerOptions.workerSrc = pdfBaseUrl + 'signature/build/pdf.worker.js'; //設置pdf.worker.js
            let cMapUrl = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.2.228/cmaps/';//設置文字路徑

            const _self = this;
            //設置pdf的請求地址
            let url = process.env.VUE_APP_API_BASE + '/signature/api/file/filedownload?access_token='+
                this.GLOBAL.global.access_token +'&fileId='+
                this.settingInfo.signatureFileId+'&companyCode=' + this.GLOBAL.global.companyCode;

            //頁面渲染完成后,請請求pdf
            this.$nextTick(() => {
                _self.pdfRunStatus = 0
                _self.loading = true;//顯示加載
                pdfjsLib.getDocument({ //請求pdf
                    url:url,
                    cMapUrl:cMapUrl,
                    cMapPacked:true
                }).promise.then(function (pdf) { //獲取pdf數(shù)據(jù)
                    for (let i = 0; i < pdf.numPages; i++) { //根據(jù)pdf的數(shù)量,動態(tài)生成縮略圖畫布
                        let item = '<canvas class="canvas" id="the_small_canvas_' + (i+1) + '"  height="136" width="98" style="border:1px solid #e4e4e4;"></canvas>';
                         //中間區(qū)域pdf畫布
                        let p_item = `<canvas class="canvas" id="p_the_canvas_${i + 1}" height="842" width="595" style="border:1px solid #e4e4e4;"></canvas>`
                        _self.pdfList.push(item);
                        _self.pdfListM.push(p_item);
                    }
                    _self.timer = setInterval(() => {
                        // 生成 分頁所有元素框
                        if (pdf.numPages > _self.pdfRunStatus) {
                            for (let i = _self.pdfRunStatus; i < _self.pdfRunStatus + 1; i++) { //動態(tài)循環(huán)去獲取每頁pdf數(shù)據(jù)
                                pdf.getPage(i + 1).then(function (page) { //獲取pdf每頁的數(shù)據(jù)

                                    let viewport = page.getViewport(1); //獲取視圖

                                    //生成縮略圖畫布
                                    let t_canvas = document.getElementById(`the_small_canvas_${i + 1}`);
                                    let t_context = t_canvas.getContext('2d');
                                    let t_scale = Math.min(t_canvas.width / viewport.width, t_canvas.height / viewport.height);//設置縮放比例

                                    //設置畫布大小
                                    t_canvas.height = 136;
                                    t_canvas.width = 98;

                                    let t_renderContext = { //顯示pdf
                                        canvasContext: t_context,
                                        viewport: page.getViewport(t_scale)
                                    };
                                    page.render(t_renderContext);

                                    //設置拖拽區(qū)域的寬度跟高度
                                    _self.canvas.width = Math.ceil(viewport.width);
                                    _self.canvas.height += Math.ceil(viewport.height);
                                    // if(page.rotate !==0){
                                    //   page._pageInfo.rotate = 90;
                                    // }
                                    //設置高度區(qū)間
                                    _self.heightList.push(_self.canvas.height);
                                    //設置每頁pdf高度
                                    _self.eachHeight.push(Math.ceil(viewport.height))
                                    //獲取畫布父節(jié)點
                                    let pageDiv = document.getElementById(`canvas_box_${i}`);
                                    //生成中間區(qū)域畫布
                                    let p_canvas = document.getElementById(`p_the_canvas_${i + 1}`); //獲取畫布的dom節(jié)點
                                    let p_context = p_canvas.getContext('2d');

                                    //設置畫布寬度跟高度
                                    p_canvas.width = Math.ceil(viewport.width);
                                    p_canvas.height = Math.ceil(viewport.height);

                                    //設置畫布父元素高度跟寬度
                                    pageDiv.style.width = Math.ceil(viewport.width) + 'px';
                                    pageDiv.style.height = Math.ceil(viewport.height) + 'px';

                                    let p_scale = Math.min(p_canvas.width / viewport.width, p_canvas.height / viewport.height); //設置要縮放的大小
                                    let p_renderContext = { //顯示pdf
                                        canvasContext: p_context,
                                        viewport: page.getViewport(p_scale)
                                    };
                                    if(_self.pdfRunStatus === pdf.numPages) { //全部加載完畢
                                        _self.getInfo();//獲取當前頁面得勾選位置跟人員位置列表
                                        _self.getVoterInfo();//獲取表決票的數(shù)據(jù)
                                        if(!_self.isView){
                                          _self.showImportBtn();//判斷是否應該顯示導入其他文件簽字位置按鈕
                                        }
                                        _self.loading = false;
                                    }
                                    //以下代碼為了創(chuàng)建文本圖層,可以復制pdf上的文字
                                    page.render(p_renderContext).then(()=>{
                                        return page.getTextContent();
                                    }).then((textContent)=>{
                                        // 創(chuàng)建文本圖層div
                                        const textLayerDiv = document.createElement('div');
                                        //添加class
                                        textLayerDiv.setAttribute('class', 'textLayer');
                                        // // 將文本圖層div添加至每頁pdf的div中
                                        pageDiv.appendChild(textLayerDiv);

                                        //創(chuàng)建頁碼圖層
                                        const pageNum = document.createElement('div');
                                        //添加class
                                        pageNum.setAttribute('class','setting-position-middle-page');
                                        //設置頁碼顯示的內(nèi)容
                                        pageNum.innerHTML = '第' + (i+1) + '頁';
                                        //添加到dom節(jié)點中
                                        pageDiv.appendChild(pageNum);

                                        // 創(chuàng)建新的TextLayerBuilder實例
                                        var textLayer = new TextLayerBuilder({
                                            textLayerDiv: textLayerDiv,
                                            pageIndex: page.pageIndex,
                                            viewport: viewport
                                        });

                                        textLayer.setTextContent(textContent);
                                        textLayer.render();
                                    });
                                });
                            }
                            _self.pdfRunStatus += 1
                        } else {
                            clearInterval(_self.timer)
                        }
                    }, 100);
                }).catch((res)=>{
                    _self.loading = false;
                })
            })
        },
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容