純前端使用插件pdfjs實(shí)現(xiàn)將pdf轉(zhuǎn)為圖片的步驟
需求來(lái)源
預(yù)覽簡(jiǎn)歷功能在移動(dòng)端,由于用了一層iframe把這個(gè)功能嵌套在了app端,再用一個(gè)iframe來(lái)預(yù)覽,只有ios能看到,安卓就不支持,查了很多資料和插件,原理基本上都是用iframe實(shí)現(xiàn)的。最終轉(zhuǎn)換思路,將pdf下載轉(zhuǎn)為圖片然后繪制到canvans中也是一樣的效果。


實(shí)現(xiàn)步驟
先安裝pdfjs插件,插件開(kāi)源免費(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),官方的示例中沒(méi)有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)遍歷每一頁(yè)pdf,將其轉(zhuǎn)成圖片
for (let i = 1; i <= pdf._pdfInfo.numPages; i++) {
// 獲取pdf頁(yè)
const page = await pdf.getPage(i);
// 獲取頁(yè)的尺寸
const viewport = page.getViewport({ scale: 1 });
// 設(shè)置canvas的尺寸
canvas.width = viewport.width;
canvas.height = viewport.height;
// 將pdf頁(yè)渲染到canvas上
await page.render({ canvasContext: context, viewport: viewport }).promise;
// 將canvas轉(zhuǎn)成圖片,并添加到頁(yè)面上
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>
最終效果:

問(wèn)題
跨域


我直接放入設(shè)置了跨域的鏈接到url是可以直接得到pdf的,但是目前這個(gè)跨域問(wèn)題,后臺(tái)說(shuō)是有設(shè)置跨域,但是我請(qǐng)求有跨域,我在前端配置了跨域也還是不行。多番嘗試后這個(gè)問(wèn)題還是沒(méi)有解決。由于時(shí)間緊迫,所以采用備用方案:后臺(tái)在接口返回了pdf的base64格式,pdfjs官方案例中說(shuō)需要將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ù)組降維之將二維數(shù)組轉(zhuǎn)為一維數(shù)組的五種方案
本文介紹了五種數(shù)組降維方法,從最簡(jiǎn)單的Array.prototype.flat()方法,到兼容舊版本的concat;spread方法,再到通用的reduce方法,以及處理任意深度嵌套的遞歸方法, 兌時(shí)建議總結(jié)不同方法的特點(diǎn)、適用場(chǎng)景和性能差異,需要的朋友可以參考下2026-05-05
JavaScript之BOM?location對(duì)象+navigator對(duì)象+history?對(duì)象
這篇文章主要介紹了JavaScript?BOM中的?location對(duì)象、navigator對(duì)象、history?對(duì)象,下面圍繞他們的相關(guān)語(yǔ)法及各種資料展開(kāi)文章詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)大家有所幫助2021-12-12
JS轉(zhuǎn)換金額大寫(xiě)方法詳細(xì)例子
在處理財(cái)務(wù)賬款類需求時(shí)需要將轉(zhuǎn)賬金額寫(xiě)成大寫(xiě)的,下面這篇文章主要給大家介紹了關(guān)于JS轉(zhuǎn)換金額大寫(xiě)方法的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10
如何用JS實(shí)現(xiàn)網(wǎng)頁(yè)瀑布流布局
這篇文章主要介紹了如何用JS實(shí)現(xiàn)網(wǎng)頁(yè)瀑布流布局,幫助大家更好的利用JavaScript制作網(wǎng)頁(yè),感興趣的朋友可以了解下2021-04-04
Echarts如何自定義label標(biāo)簽的樣式(formatter,rich,添加圖標(biāo)等操作)
通常情況下,echarts中對(duì)于圖像的設(shè)置是統(tǒng)一的,下面這篇文章主要給大家介紹了關(guān)于Echarts如何自定義label標(biāo)簽的樣式的相關(guān)資料,包括formatter,rich,添加圖標(biāo)等操作,需要的朋友可以參考下2023-02-02

