Vue3预览pdf(增加水印&禁止下载)

需求:

根据后端返回的base64位pdf编码,预览pdf文件同时增加水印,禁止下载功能

用到的功能

  1. Vue3
  2. element plus 的 watermark
  3. pdfjs-dist(只用于获取文件页数) 版本:2.16.105
  4. iframe(用于展示pdf)

遇到的问题

  1. 引用pdfjs报错
  2. 鼠标右键可以直接下载pdf
  3. pdf展示不全,因为是用iframe来预览pdf,如果未指定高度的话且增加了遮罩的话会出现无法滚动的问题

解决:

1.引用pdfjs-dist会报错
报错的引用

import { PdfJs } from "pdfjs-dist";

改正后的引用

import * as PdfJs from "pdfjs-dist/legacy/build/pdf.js";

还有一个问题,在配置workerSrc的时候版本号要与依赖的版本号一致,不然也会报错

PdfJs.GlobalWorkerOptions.workerSrc = "https://cdn.jsdelivr.net/npm/pdfjs-dist@2.16.105/build/pdf.worker.js";

2.iframe提供了隐藏功能按键的方式,就是在src地址后面增加 ‘#toolbar=0’ 但是如果使用鼠标右键的话还是可以直接保存文件到电脑,不符合产品要求,最后考虑增加蒙层来达到禁止下载的目的

<div class="bf_mask" @contextmenu.prevent=""></div>

3.之前并没有计划使用插件来做这个功能,但是增加了遮罩之后,出现pdf无法滚动的情况,想到的解决方法是给iframe设置高度,所以就用了插件来获取文件的页数然后计算出高度实现页面滚动

const loadingTask = PdfJs.getDocument(pdfUrl);
loadingTask.promise.then(pdf => {
  pdfPages.value = pdf.numPages;
  pdfHeight.value = 1150 * pdfPages.value + "vh"; // iframe 的高度 :height="pdfHeight"
});

代码:

html代码

<template>
  <div class="content">
    <el-watermark :font="font" content="资料仅限查看,严禁外传" style="height: auto">
      <iframe :src="pdfUrl + '#toolbar=0'" frameborder="0" style="width: 100%; border: 0" :height="pdfHeight"></iframe>
      <div class="bf_mask" @contextmenu.prevent=""></div>
    </el-watermark>
  </div>
</template>

效果:

在这里插入图片描述

Vue 3 中预览 PDF 并隐藏下载按钮,您可以使用 PDF.js 库来加载 PDF 文件,并使用 CSS 来隐藏下载按钮。以下是一个简单的示例: 1. 安装 PDF.js 库 ``` npm install pdfjs-dist ``` 2. 在 Vue 组件中引入 PDF.js 和样式文件 ```javascript import pdfjsLib from 'pdfjs-dist/webpack'; import 'pdfjs-dist/web/pdf_viewer.css'; ``` 3. 创建一个 PDF 预览的组件,使用 PDF.js 加载 PDF 文件 ```html <template> <div ref="pdfViewer"></div> </template> <script> export default { data() { return { pdfUrl: 'path/to/pdf/file.pdf', pdfViewer: null }; }, mounted() { this.loadPdf(); }, methods: { loadPdf() { const viewerContainer = this.$refs.pdfViewer; const pdfViewer = new pdfjsLib.PDFViewer({ container: viewerContainer }); viewerContainer.addEventListener('pagesinit', () => { pdfViewer.eventBus.dispatch('toggleSecondaryToolbar', { visible: false }); }); pdfjsLib.getDocument(this.pdfUrl).promise.then(pdf => { pdfViewer.setDocument(pdf); this.pdfViewer = pdfViewer; }); } } }; </script> ``` 在上面的代码中,我们创建了一个 `PDFViewer` 实例,并将其添加到 Vue 组件的 DOM 中。一旦 PDF 文件加载完成,我们可以将 `pdfViewer` 对象保存到组件的数据中,以便在以后的操作中使用。 在 `pagesinit` 事件中,我们使用 PDF.js 的 `eventBus` 对象来切换 PDF 查看器的次要工具栏可见性,从而隐藏下载按钮。 最后,我们使用 `pdfjsLib.getDocument` 方法来加载 PDF 文件并将其设置到 `pdfViewer` 中。 4. 在样式文件中隐藏下载按钮 ```css button.toolbarButton.download { display: none !important; } ``` 在上面的样式中,我们使用 `!important` 来覆盖 PDF.js下载按钮的默认样式,并将其设置为 `display: none` 来隐藏该按钮。 这样,在 Vue 3 组件中预览 PDF 时,下载按钮就会被隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值