vue实现在线预览pdf

使用 fetch 获取pdf 的buffer 流,然后使用 pdfjs 获取每一页的数据,从而绘制在 canvas 上

文件列表

  1. pdf.js
  2. pdf.worker.js

在 index.html 上引入pdd.js,可以使用 cdn 链接,也可以使用本地文件,建议将2个文件放在服务器

// 只需要手动引入这一个文件即可,另一个文件在该文件中引用了
<script src="<%= BASE_URL %>js/pdf.js"></script>

组件代码

<template>
    <div style="width: 100%;height: 100%;overflow: auto;" id="pdfviewRef">
        <div v-for="page in totalPages" :key="page">
            <canvas :ref="`pdfCanvas${page}`" :id="'pdfCanvas-' + page"></canvas>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                pdfInstance: null,
                totalPages: 0
            };
        },
        props:{
            url:{
                type:String,
                default:""
            }
        },
        methods: {
            async initRender () {
                document.querySelector('#pdfviewRef').innerHTML = ''
                await this.loadPdf();
            },
            async loadPdf() {
                const pdfData = await this.fetchPdfData(this.url);
                await this.renderPdf(pdfData);
            },
            async fetchPdfData(url) {
                const response = await fetch(url);
                return response.arrayBuffer();
            },
            async renderPdf(pdfData) {
                const pdfjsLib = window['pdfjs-dist/build/pdf'];
                this.pdfInstance = await pdfjsLib.getDocument({data: pdfData, cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@3.10.111/cmaps/', cMapPacked: true}).promise;
                this.totalPages = this.pdfInstance.numPages;
                this.$nextTick(async () => {
                    for (let pageNumber = 1; pageNumber <= this.totalPages; pageNumber++) {
                        await this.renderPage(pageNumber);
                    }
                })
            },
            async renderPage(pageNumber) {
                const pdfCanvas = this.$refs['pdfCanvas' + pageNumber][0];
                const page = await this.pdfInstance.getPage(pageNumber);
                const viewport = page.getViewport({scale: 1});
                const canvasContext = pdfCanvas.getContext('2d');
                pdfCanvas.width = viewport.width;
                pdfCanvas.height = viewport.height;

                const renderContext = {
                    canvasContext,
                    viewport
                };

                await page.render(renderContext).promise;
            }
        }
    };
</script>

组件使用

<pdf ref='pdfRef' url='xxx.pdf'/>

import pdf from 'pdf.vue'

pdfRef.initRender()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值