Vue网页中使用PDF.js弹窗显示pdf文档所有内容

本文中使用的PDF.js组件版本为3.11.174(最新版使用上会有所不同),引入文件如下:

首先页面定义一个隐藏的弹窗块(此处用ElementUI的Dialog组件)

html 复制代码
<el-dialog ref="dialogPDF" :title="pdffile.name" center :visible.sync="isPDFVisible" width="80%"  :close-on-click-modal="true"  :show-close="true">
    <div>
        @*<canvas id="pdf-canvas"></canvas>*@
        <!--由于是要展示所有面面,所以所有页面都分别绑定一个canvas-->
        <canvas ref="pdf-canvas" v-for="num in pdfPages"></canvas>
    </div>
</el-dialog>

绑定的Vue Data:

javascript 复制代码
data: function() {
    return {
        pdffile: {},
        isPDFVisible: false,
        pdfPages: 0,
        ..........
    }
}

要展示的文件这里集成在一个上传组件中,如代码所示:

html 复制代码
<el-form-item label="附件" prop="FileIDsArray">
    <div style="max-height:512px;overflow-x:auto;">
        <el-upload ref="upload_attach" :file-list="editForm.FileInfos" drag list-type="picture-card" multiple :limit="maxUpload" :on-exceed="handleExceed"
                   :action="uploadUrl" :auto-upload="autoupload" @*:headers="headers"*@ :data="uploadParam" :on-change="handleChange1" :before-upload="beforeUpload"
                   :on-success="uploadSuccess1" @*:on-preview="previewPic"*@ :on-remove="removeAttachFile1" :before-remove="beforeRemove" :class="{hideUnload:notAttachUploader}">
            @*<em class="el-icon-plus"></em>*@
            <em class="el-icon-upload"></em>
            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>

            <div slot="file" slot-scope="{file}">
                @*<img class="el-upload-list__item-thumbnail"
                    :src="file.url" alt="">*@
                <span>{{file.name}}</span>
                <span class="el-upload-list__item-actions">
                    <span class="el-upload-list__item-preview" style="font-size: inherit;" v-show="!!file && file.name.slice(-4).toLowerCase()=='.pdf'"
                          @@click="handleViewFile(file)">
                        <i class="el-icon-zoom-in"></i>
                    </span>
                    <span class="el-upload-list__item-delete"
                          @@click="handleDownload(file)">
                        <i class="el-icon-download"></i>
                    </span>
                    <span class="el-upload-list__item-delete"
                          @@click="$refs.upload_attach.$refs['upload-inner'].onRemove(file);">
                        <i class="el-icon-delete"></i>
                    </span>
                </span>
            </div>

        </el-upload>
    </div>
</el-form-item>

重点是在显示PDF文件内容的方法------handleViewFile(file):

javascript 复制代码
handleViewFile: function (file) {
    var pThis = this;
    this.pdffile = file;
    this.isPDFVisible = true;
    this.$nextTick(function () {
        //const canvas = document.getElementById('pdf-canvas');
        pdfjsLib.getDocument(file.url).promise.then(function (pdfDoc) {
            pThis.pdfPages = pdfDoc.numPages;
            //由于canvas.getContext('2d')必须是在生成DOM并显示的情况下操作,由此需先"isPDFVisible=true"显示出组件,并在$nextTick完成DOM加载后再处理pdf内容的渲染:
            pThis.$nextTick(function () {
                for (var i = 1; i <= pThis.pdfPages; i++) {
                    const canvas = pThis.$refs["pdf-canvas"][i - 1];
                    pdfDoc.getPage(i).then(function (page) {
                        const viewport = page.getViewport({ scale: 1 });
                        const context = canvas.getContext('2d');
                        canvas.height = viewport.height;
                        canvas.width = viewport.width;
                        page.render({
                            canvasContext: context,
                            viewport: viewport
                        });
                    });
                }
            });
        });
    });
},

参考文章:

PDF.js 示例简介:

https://blog.csdn.net/github_36738403/article/details/131325145

如何显示整体PDF(不仅仅是一页)PDF.JS:

https://www.codenong.com/cs108161952/

相关推荐
CodeCraft Studio14 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
索迪迈科技16 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
Light6016 小时前
领码方案|Linux 下 PLT → PDF 转换服务超级完整版:异步、权限、进度
linux·pdf·可观测性·异步队列·plt转pdf·权限治理·进度查询
ftswsfb16 小时前
PDF文件基础-计算机字体
pdf
一朵梨花压海棠go17 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
一只小风华~18 小时前
Vue: Class 与 Style 绑定
前端·javascript·vue.js·typescript·前端框架
十碗饭吃不饱18 小时前
net::ERR_EMPTY_RESPONSE
java·javascript·chrome·html5
Zz_waiting.19 小时前
Javaweb - 14.6 - Vue3 数据交互 Axios
开发语言·前端·javascript·vue·axios
切糕师学AI19 小时前
前后端分离架构中,Node.js的底层实现原理与线程池饥饿问题解析
前端·vue.js·node.js
虎头金猫20 小时前
如何在Linux上使用Docker在本地部署开源PDF工具Stirling PDF:StirlingPDF+cpolar让专业操作像在线文档一样简单
linux·运维·ubuntu·docker·pdf·开源·centos