当前位置: 首页 > Web前端 > HTML

PDF.js实现个性化PDF渲染(文字复制)

时间:2023-04-03 00:10:48 HTML

鎴戣儢馃榿銆傜湅鍒癛edux鏁欑▼娴忚閲忕獊鐮翠笁涓囷紝蹇冮噷鏆楄嚜楂樺叴銆傚緢楂樺叴鎴戠殑鏂囩珷鍙互甯姪鍒板ぇ瀹躲€傝繖娆″洖褰掞紝杩樻槸缁欏ぇ瀹跺甫鏉ヤ簡涓€涓皬鏀荤暐锛屼篃鏄垜鏈€杩戝湪宸ヤ綔涓亣鍒扮殑涓€涓皬妗堜緥銆傚墠涓嶄箙锛屼骇鍝佺粡鐞嗘彁鍑鸿鍦ㄧ晫闈笂浼橀泤鐨勫睍绀篜DF鏂囨。锛岄┈涓婃湁涓ょ瀹炵幇鏂瑰紡锛氬疄鐜版柟寮忎竴锛氫娇鐢╡mbed鏍囩锛屼娇鐢ㄦ祻瑙堝櫒鑷甫鐨刾df宸ュ叿銆傝繖绉嶅疄鐜扮殑浼樼己鐐瑰緢鏄庢樉锛氫紭鐐癸細鑷甫鈥滄墦鍗扳€濄€佲€滄悳绱⑩€濄€佲€滅炕椤碘€濈瓑鍔熻兘锛屽姛鑳藉己澶э紝鏄撲簬瀹炵幇銆傜己鐐癸細涓嶅悓娴忚鍣╬df宸ュ叿椋庢牸涓嶅悓锛屼笉鑳芥弧瓒充釜鎬у寲闇€姹傦紝濡傦細绂佹鎵撳嵃銆佷笅杞界瓑銆傛垜浠殑浜у搧缁忕悊鎸戝墧馃槖锛屾墍浠?..瀹炵幇鏂规硶2浣跨敤Mozilla鐨凱DF.js鑷畾涔塒DF鐨勬樉绀恒€備笅闈㈣缁嗚涓€涓嬪湪浣跨敤PDF.js杩囩▼涓亣鍒扮殑闂銆備富瑕佸寘鎷細鍩烘湰鍔熻兘闆嗘垚浣跨敤Text-Layers娓叉煋浠€涔堟槸PDF.JSPDF.js鍩轰簬HTML5鎶€鏈瀯寤猴紝浠ュ彲绉绘鏂囨。鏍煎紡锛圥DF锛夋樉绀烘枃浠讹紝鏃犻渶瀹夎浠讳綍绗笁鏂规彃浠跺嵆鍙湪鐜颁唬娴忚鍣ㄤ腑浣跨敤-鎻掍欢銆傚熀纭€鍔熻兘鏁村悎1锔忊儯寮曠敤棣栧厛锛屽紩鐢≒DF.js鐨勬椂鍊欏嚭鐜伴棶棰樸€傚畼缃戞彁鍒伴€氳繃CDN寮曠敤鎴栬€呬笅杞芥簮鐮佸埌鏈湴銆傝€屾垜浠篃涓嶆兂姹℃煋鎴戜滑鐨刬ndex.html锛屽笇鏈涙瘡涓紩鐢ㄧ殑妗嗘灦閮芥湁涓€涓粺涓€鐨勭増鏈鐞嗐€傛墍浠ワ紝鎴戜滑鎵惧埌浜嗕竴涓寘锛歱dfjs-dist銆備娇鐢╪pminstallpdfjs-dist鎴戜滑瀵煎叆PDF.js銆傚熀鏈姛鑳藉繀椤诲弬鑰冧袱涓枃浠讹細pdf.jspdf.worker.js濡傛灉浣跨敤CDN锛屽彲浠ョ洿鎺ュ弬鑰冧互涓嬪搴旀枃浠讹細https://mozilla.github.io/pdf...https://mozilla.github.io/pdf...濡傛灉浣跨敤npm锛屽弬鑰冮渶瑕佷娇鐢≒DF.js鐨勬枃浠跺涓嬶細importPDFJSfrom'pdfjs-dist';PDFJS.GlobalWorkerOptions.workerSrc='pdfjs-dist/鏋勫缓/pdf.worker.js';杩欎袱涓枃浠跺寘鍚幏鍙栥€佽В鏋愬拰鏄剧ずPDF鏂囨。鐨勬柟娉曪紝浣嗘槸瑙f瀽鍜屾覆鏌揚DF鐨勬椂闂存瘮杈冮暱锛屽彲鑳戒細闃诲鍏朵粬JS浠g爜鐨勮繍琛屻€備负浜嗚В鍐宠繖涓棶棰橈紝pdf.js渚濊禆浜嶩TML5寮曞叆鐨刉ebWorkers锛岄€氳繃浠庝富绾跨▼涓Щ闄ゅぇ閲廋PU鎿嶄綔锛堜緥濡傝В鏋愬拰娓叉煋锛夋潵鎻愰珮鎬ц兘銆傛墍鏈塒DF.jsAPI閮借繑鍥炰竴涓狿romise锛屼娇鎴戜滑鑳藉浼橀泤鍦板鐞嗗紓姝ユ搷浣溿€?锔忊儯浣跨敤棣栧厛鎴戜滑闇€瑕佸湪HTML涓坊鍔?canvas>鍏冪礌鏉ユ覆鏌揚DF锛?canvasid="pdf-canvas">鐒跺悗娣诲姞js浠g爜鏉ユ覆鏌揚DF锛歷arurl='Helloworld.pdf';PDFJS銆俫etDocument(url).then((pdf)=>{returnpdf.getPage(1);}).then((page)=>{//璁剧疆鏄剧ず姣斾緥varscale=1.5;//鑾峰彇pdf澶у皬varviewport=page.getViewport(scale);//鑾峰彇瑕佹覆鏌撶殑鍏冪礌varcanvas=document.getElementById('pdf-canvas');varcontext=canvas.getContext('2d');canvas.height=viewport.height;canvas.width=viewport.width;varrenderContext={canvasContext:context,viewport:viewport};page.render(renderContext);});鐜板湪锛孭DF宸茬粡鎴愬姛娓叉煋鍒扮晫闈笂浜嗐€備笅闈㈠垎鏋愪竴涓嬬敤鍒扮殑鍑芥暟锛歡etDocument()锛氱敤浜庡紓姝ヨ幏鍙朠Df鏂囨。锛屽彂閫佸涓狝jax璇锋眰鍒嗗潡涓嬭浇鏂囨。銆傚畠杩斿洖涓€涓狿romise锛孭romise鐨勬垚鍔熷洖璋冧紶閫掍竴涓寘鍚玃DF鏂囨。淇℃伅鐨勫璞★紝鍥炶皟涓殑浠g爜浼氬湪PDF鏂囨。鑾峰彇瀹屾垚鍚庢墽琛屻€俫etPage()锛氱敤浜庤幏鍙朠DF鏂囨。涓殑姣忎竴椤点€俫etViewport()锛氶拡瀵规彁渚涚殑鏄剧ず姣斾緥杩斿洖PDF鏂囨。鐨勯〉闈㈠ぇ灏忋€傛覆鏌擄紙锛夛細娓叉煋PDF銆傝嚦姝わ紝鍩烘湰鍔熻兘鍛婁竴娈佃惤銆傛褰撴垜楂樺叴鐨勫噯澶囦笂绾跨殑鏃跺€欙紝浜у搧缁忕悊鍙堟彁鍑轰簡涓€涓渶姹傦細鏂囧瓧鏂囨銆傜劧楣呫€?.鎵句簡濂藉嚑閬嶅畼鏂规枃妗o紝閮芥病鏈夋壘鍒板鍒舵枃鏈殑鏂规硶锛宻tackoverflow涓婁篃鏈夊緢澶氱被浼肩殑闂銆傜粡杩囦笉鏂殑灏濊瘯锛屾垜浠彂鐜颁簡Text-Layer銆備娇鐢═ext-Layers.js娓叉煋PDF鏀寔鍦ㄤ娇鐢–anvas娓叉煋鐨凱DF椤甸潰涓婃覆鏌撴枃鏈眰銆備絾鏄紝姝ゅ姛鑳介渶瑕佷袱涓檮鍔犳枃浠讹細text_layer_builder.js鍜宼ext_layer_builder.css銆傛垜浠彲浠ュ湪GitHub浠撳簱涓幏鍙栧畠銆傚鏋滄偍浣跨敤npm锛屽垯闇€瑕佽繘琛屼互涓嬪紩鐢細import{TextLayerBuilder}from'pdfjs-dist/web/pdf_viewer';瀵煎叆鈥減dfjs-dist/web/pdf_viewer.css鈥濓紱鐜板湪锛屾垜浠紑濮嬪疄鐜版枃鏈鍒跺姛鑳姐€傞鍏堬紝鍒涘缓娓叉煋闇€瑕丏OM鑺傜偣锛?divid="container">

div#container鏄渶澶栧眰鐨勮妭鐐癸紝鍦ㄨ繖涓猟iv涓紝鎴戜滑浼氫负PDF鐨勬瘡涓€椤靛垱寤鸿嚜宸辩殑div锛屽湪鍦ㄦ瘡涓〉闈㈢殑div涓紝閮戒細鏈変竴涓狢anvas鍏冪礌銆傛帴鐫€锛屾垜浠慨鏀笿S浠g爜锛歷arcontainer,pageDiv;functiongetPDF(url){PDFJS.getDocument(url).then((pdf)=>{pdfDoc=pdf;container=document.getElementById('container');for(vari=1;i<=pdf.numPages;i++){renderPDF(i);}})}functionrenderPDF(num){pdf.getPage(num).then((page)=>{varscale=1.5;varviewport=page.getViewport(scale);pageDiv=document.createElement('div');pageDiv.setAttribute('id','page-'+(page.pageIndex+1));pageDiv.setAttribute('style','position:relative');container.appendChild(pageDiv);varcanvas=document.createElement('canvas');pageDiv.appendChild(canvas);varcontext=canvas.getContext('2d');canvas.height=viewport.height;canvas.width=view.width;varrenderContext={canvasContext:context,viewport:viewport};page.render(renderContext);});}浠ヤ笂浠g爜鍙疄鐜颁簡澶氶〉闈㈡覆鏌撱€傛帴涓嬫潵锛岃寮€濮嬫覆鏌撴枃鏈眰锛屾垜浠渶瑕佷慨鏀筽age.render(renderContext)涓哄涓嬩唬鐮侊細page.render(renderContext).then(()=>{returnpage.getTextContent();}).then((textContent)=>{//鍒涘缓鏂囨湰灞俤ivconsttextLayerDiv=document.createElement('div');textLayerDiv.setAttribute('class','textLayer');//娣诲姞鏂囨湰灞俤iv鍒版瘡涓殑divpagepdfpageDiv.appendChild(textLayerDiv);//鍒涘缓涓€涓柊鐨凾extLayerBuilder瀹炰緥vartextLayer=newTextLayerBuilder({textLayerDiv:textLayerDiv,pageIndex:page.pageIndex,viewport:viewport});textLayer.setTextContent(textContent);textLayer.render();});鎴戜滑浠嶇劧瑙i噴浠ヤ笅鍏抽敭鍑芥暟锛歱age.render()锛氳鍑芥暟杩斿洖涓€涓狿DF椤甸潰鎴愬姛娓叉煋鍒扮晫闈㈡椂resolve鐨勬壙璇猴紝鎴戜滑鍙互浣跨敤鎴愬姛鍥炶皟鏉ユ覆鏌撴枃鏈眰銆俻age.getTextContent()锛氳鍑芥暟鍥炶皟鎴愬姛灏嗚繑鍥濸DF椤甸潰涓婄殑鏂囨湰鐗囨銆俆extLayerBuilder锛氳繖涓被鐨勫疄渚嬫湁涓や釜閲嶈鐨勬柟娉曘€俿etTextContent()鐢ㄤ簬璁剧疆page.getTextContent()鍑芥暟杩斿洖鐨勬枃鏈墖娈碉紱render()鐢ㄤ簬娓叉煋鏂囨湰灞傘€傚鏋滄父鎴忦煒庯紒閫氳繃浠ヤ笂鏀归€狅紝瀹炵幇浜嗘枃鏈鍒跺姛鑳姐€傚畼鏂规枃妗d腑娌℃湁杩欐牱鐨勬妧宸с€侾DF.js鏄竴涓緢妫掔殑宸ュ叿锛屼絾鏄枃妗f瘮杈冪畝娲侊紝闇€瑕佸紑鍙戣€呬笉鏂幓鍙戞帢PDF.js鐨勫己澶у姛鑳姐€傚鏋滆繖绡囨枃绔犲浣犳湁甯姪锛岃寰楃偣璧烉煈嶏紒