PdfViewer.vue
<template>
<div ref="pdfViewerContainer" class="pdfViewerContainer"></div>
</template>
<script>
import * as PDFJS from 'pdfjs-dist'
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry'
PDFJS.GlobalWorkerOptions.workerSrc = pdfjsWorker
export default {
name: 'PdfViewer',
props: {
pdfUrl: {
type: String,
default: '',
},
cMapUrl: {
type: String,
default: '',
},
scale: {
type: Number,
default: 1.5,
},
httpHeaders: {
type: Object,
default: () => ({}),
},
},
data() {
return {
pdfDocRef: null,
}
},
computed: {
urlObj() {
return { pdfUrl: this.pdfUrl, cMapUrl: this.cMapUrl }
},
},
watch: {
urlObj() {
this.renderPdf()
},
scale() {
this.renderPdf()
},
},
mounted() {
this.renderPdf()
},
methods: {
renderPdfOnePage(pdfViewerDom, pdfDoc, pageNum, scale) {
const canvas = document.createElement('canvas')
pdfViewerDom.appendChild(canvas)
const context = canvas.getContext('2d')
pdfDoc.getPage(pageNum).then(page => {
const viewport = page.getViewport({ scale: scale })
const realCanvas = context.canvas
realCanvas.width = viewport.width
realCanvas.height = viewport.height
page.render({ canvasContext: context, viewport })
})
},
renderPdfCanvas(pdfViewerDom, pdfDoc, scale) {
pdfViewerDom.innerHTML = ''
const totalPage = pdfDoc.numPages
for (let i = 1; i <= totalPage; i++) {
this.renderPdfOnePage(pdfViewerDom, pdfDoc, i, scale)
}
},
renderPdf() {
const pdfViewerDom = this.$refs.pdfViewerContainer
if (this.pdfUrl) {
const pdfLoadingTask = PDFJS.getDocument({
url: this.pdfUrl,
withCredentials: true,
httpHeaders: this.httpHeaders,
cMapUrl: this.cMapUrl,
cMapPacked: true,
})
pdfLoadingTask.promise.then(pdfDoc => {
if (pdfDoc && pdfViewerDom) {
this.pdfDocRef = pdfDoc
this.renderPdfCanvas(pdfViewerDom, pdfDoc, this.scale)
}
})
}
},
},
}
</script>
<style scoped></style>
调用
<PdfViewer pdf-url="http://localhost:3000/CHANGELOG.pdf"></PdfViewer>