純前端使用插件pdfjs實(shí)現(xiàn)將pdf轉(zhuǎn)為圖片的步驟
需求來源
預(yù)覽簡歷功能在移動(dòng)端,由于用了一層iframe把這個(gè)功能嵌套在了app端,再用一個(gè)iframe來預(yù)覽,只有ios能看到,安卓就不支持,查了很多資料和插件,原理基本上都是用iframe實(shí)現(xiàn)的。最終轉(zhuǎn)換思路,將pdf下載轉(zhuǎn)為圖片然后繪制到canvans中也是一樣的效果。
實(shí)現(xiàn)步驟
先安裝pdfjs插件,插件開源免費(fèi)
官網(wǎng):
https://github.com/mozilla/pdf.js
在vue或react項(xiàng)目中使用
https://github.com/mozilla/pdf.js/wiki/Setup-pdf.js-in-a-website
npm install pdfjs-dist --save
:
上面幾步完成后就完成80%了,剩下的就是把圖片繪制到canvans了
這里我直接貼源碼了,注意一點(diǎn),官方的示例中沒有import 'pdfjs-dist/build/pdf.worker.mjs';
這一段導(dǎo)入,會(huì)有一個(gè)報(bào)錯(cuò)
gihub上有解釋
https://github.com/mozilla/pdf.js/issues/10478
<template> <div ref="showpdfRef"></div> </template> <script setup> import { ref } from 'vue'; import { getDocument } from 'pdfjs-dist/legacy/build/pdf.mjs'; import 'pdfjs-dist/build/pdf.worker.mjs'; const showpdfRef = ref(null); const pdfPath ='xxxxxxxx' const loadingTask = getDocument(pdfPath); loadingTask.promise .then(async (pdf) => { const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); // 循環(huán)遍歷每一頁pdf,將其轉(zhuǎn)成圖片 for (let i = 1; i <= pdf._pdfInfo.numPages; i++) { // 獲取pdf頁 const page = await pdf.getPage(i); // 獲取頁的尺寸 const viewport = page.getViewport({ scale: 1 }); // 設(shè)置canvas的尺寸 canvas.width = viewport.width; canvas.height = viewport.height; // 將pdf頁渲染到canvas上 await page.render({ canvasContext: context, viewport: viewport }).promise; // 將canvas轉(zhuǎn)成圖片,并添加到頁面上 const img = document.createElement('img'); img.src = canvas.toDataURL('image/png'); showpdfRef.value.appendChild(img); } }) .then( function () { console.log('# End of Document'); }, function (err) { console.error('Error: ' + err); }, ); </script> <style scoped></style>
最終效果:
問題
跨域
我直接放入設(shè)置了跨域的鏈接到url是可以直接得到pdf的,但是目前這個(gè)跨域問題,后臺(tái)說是有設(shè)置跨域,但是我請(qǐng)求有跨域,我在前端配置了跨域也還是不行。多番嘗試后這個(gè)問題還是沒有解決。由于時(shí)間緊迫,所以采用備用方案:后臺(tái)在接口返回了pdf的base64格式,pdfjs官方案例中說需要將base64轉(zhuǎn)為二進(jìn)制數(shù)據(jù)就可以加載。
https://github.com/mozilla/pdf.js/blob/master/examples/learning/helloworld64.html
總結(jié)
到此這篇關(guān)于純前端使用插件pdfjs實(shí)現(xiàn)將pdf轉(zhuǎn)為圖片的文章就介紹到這了,更多相關(guān)插件pdfjs將pdf轉(zhuǎn)為圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解用原生JavaScript實(shí)現(xiàn)jQuery的某些簡單功能
本篇文章主要對(duì)用原生JavaScript實(shí)現(xiàn)jQuery的某些簡單功能進(jìn)行詳細(xì)全面的講解,具有很好的參考價(jià)值,需要的朋友一起來看下吧2016-12-12如何通過遞歸方法實(shí)現(xiàn)用json-diff渲染json字符串對(duì)比結(jié)果
JsonDiff是一個(gè)高性能json差異發(fā)現(xiàn)工具,它幾乎可以發(fā)現(xiàn)任何JSON結(jié)構(gòu)的差異,并且將錯(cuò)誤信息反饋給用戶,下面這篇文章主要給大家介紹了關(guān)于如何通過遞歸方法實(shí)現(xiàn)用json-diff渲染json字符串對(duì)比結(jié)果的相關(guān)資料,需要的朋友可以參考下2022-12-12解析如何利用iframe標(biāo)簽以及js制作時(shí)鐘
本文對(duì)如何利用iframe標(biāo)簽以及js制作時(shí)鐘進(jìn)行了全面解析,分步說明,條理清晰,感興趣的朋友可以看下2016-12-12淺談一個(gè)webpack構(gòu)建速度優(yōu)化誤區(qū)
這篇文章主要介紹了淺談一個(gè)webpack構(gòu)建速度優(yōu)化誤區(qū),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06js通過location.search來獲取頁面?zhèn)鱽淼膮?shù)
js獲取通過window.location.search來獲取頁面?zhèn)鱽淼膮?shù),經(jīng)測試可用,大家可以學(xué)習(xí)下2014-09-09JavaScript實(shí)現(xiàn)數(shù)組降維詳解
大家都知道將多維數(shù)組(尤其是二維數(shù)組)轉(zhuǎn)化為一維數(shù)組是業(yè)務(wù)開發(fā)中的常用邏輯,除了使用樸素的循環(huán)轉(zhuǎn)換以外,我們還可以利用Javascript的語言特性和數(shù)據(jù)結(jié)構(gòu)的思想實(shí)現(xiàn)更為簡潔優(yōu)雅的轉(zhuǎn)換。下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)關(guān)于JavaScript如何實(shí)現(xiàn)數(shù)組降維吧。2017-01-01