我们可以使用 pdf.js 这个库。首先需要安装 pdf.js:
npm install pdfjs-dist
接下来,我们在 Vue3 项目中创建一个名为 PdfViewer.vue 的组件:
<template><div class="pdf-viewer"><canvas ref="pdfCanvas"></canvas></div>
</template><script>
import { onMounted, ref } from 'vue';
import { getDocument } from 'pdfjs-dist/webpack';export default {name: 'PdfViewer',setup() {const pdfCanvas = ref(null);let pdfDoc = null;let pageNum = 1;let pageRendering = false;let pageNumPending = null;function renderPage(num) {pageRendering = true;pdfDoc.getPage(num).then((page) => {const scale = 1.5;const viewport = page.getViewport({ scale: scale });const canvas = document.createElement('canvas');const context = canvas.getContext('2d');canvas.height = viewport.height;canvas.width = viewport.width;const renderContext = {canvasContext: context,viewport: viewport,};const renderTask = page.render(renderContext);renderTask.promise.then(() => {if (!pageRendering) {return;} else {pageRendering = false;if (pageNumPending !== null) {renderPage(pageNumPending);pageNumPending = null;}}});});document.getElementById('pdfCanvas').appendChild(canvas);}onMounted(() => {const loadingTask = getDocument('path/to/your/pdf/file.pdf');loadingTask.promise.then((pdf) => {pdfDoc = pdf;renderPage(pageNum);});});return {pdfCanvas,};},
};
</script>
在这个组件中,我们首先导入了 onMounted、ref 和 getDocument。然后,我们创建了一个名为 pdfCanvas 的引用,用于存储 PDF 文件的画布元素。我们还定义了一些变量,如 pdfDoc(用于存储 PDF 文档对象)、pageNum(用于跟踪当前显示的页面)、pageRendering(用于防止在渲染过程中多次触发渲染)和 pageNumPending(用于存储待处理的页面)。
接下来,我们定义了一个名为 renderPage 的函数,该函数接受一个页面编号作为参数。在这个函数中,我们首先将 pageRendering 设置为 true,然后获取指定页面的 PDF 对象。接着,我们创建一个画布元素,并设置其高度和宽度为 PDF 页面的视口大小。然后,我们使用 pdf.js 提供的 render 方法渲染页面,并将渲染结果绘制到画布上。最后,我们将画布元素添加到页面中。
在 setup 函数中,我们使用 onMounted 钩子在组件挂载时加载 PDF 文件。我们调用 getDocument 函数获取 PDF 文档对象,并将其存储在 pdfDoc 变量中。然后,我们调用 renderPage 函数渲染第一页。