1、安装 pdf.js
注:pdfjs-dist 必须跟 vue-pdf 版本匹配
npm install pdfjs-dist
2、引入 pdfjs-dist
<script>
import * as pdfjsLib from "pdfjs-dist";
pdfjsLib.GlobalWorkerOptions.workerSrc =
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.6.347/pdf.worker.min.js";
</script>
3、场景一:如有多个封面需要展示,循环画canvas
<template>
<div
class="content-div"
v-for="(item, index) in propCompanyData.authorize_info"
:key="item.id"
>
<canvas
v-show="item.pdfData"
:ref="'pdfCanvas' + item.id" //每个数据有独立的ref
style="
width: 100%;
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3);
height: 542px;
"
></canvas>
</div>
</template>
<script>
async loadPdfCovers() {
// 本案例的 propCompanyData 数据是从父组件传递过来的,pdfData在父组件中已进行赋值为二进制数据
for (const item of this.propCompanyData.authorize_info) {
// item.pdfData 里存放的是二进制数据
if (item.pdfData) {
// 循环调用画canvas
await this.renderPdfCover(item);
}
}
},
// 渲染canvas
async renderPdfCover(item) {
// 获取 canvas 元素
const canvas = this.$refs["pdfCanvas" + item.id][0];
const context = canvas.getContext("2d");
// 使用 pdf.js 处理 pdfData
const pdf = await pdfjsLib.getDocument({ data: item.pdfData }).promise;
const page = await pdf.getPage(1); // 获取第一页面
const scale = 1.5;
const viewport = page.getViewport({ scale });
// 设置 canvas 尺寸
canvas.height = viewport.height;
canvas.width = viewport.width;
// 渲染页面到 canvas
page.render({
canvasContext: context,
viewport: viewport,
});
},
</script>
4、场景二:如果只有一个封面需要展示,获取到二进制流后,直接调用 renderPdfCover 方法, 修改为下
async renderPdfCover(item) {
//将 const canvas = this.$refs["pdfCanvas" + item.id][0]; 改为
const canvas = this.$refs["pdfCanvas"]; // pdfCanvas 是你对应canvas的ref名
},