vue实现PDF文件预览

pdf文件预览是开发业务时常见的一个交互,在toB项目中是经常用到的,对于用户上传文件,预览文件等操作时有一个更好的体验,下面我结合实际业务,在vue的基础上与大家分享这个实现方法。

一.安装vue-pdf和vue-pdf-embed这两个库

在业务组件中导入

javascript 复制代码
   import pdf from "vue-pdf";
   import VuePdfEmbed from "vue-pdf-embed";

二.在上传文件组件的文件列表处绑定预览方法

复制代码
        <Upload.Dragger
          style="position: relative; width: 80%; cursor: pointer"
          :maxCount="1"
          :beforeUpload="beforeUpload"
          accept=".pdf"
          @remove="removeFile"
          @preview="getNumPages" //预览文件
        >
          <div>
            <p class="ant-upload-drag-icon">
              <CloudUploadOutlined />
            </p>
            <p class="ant-upload-text">点击或将文件拖拽到此处</p>
            <p class="ant-upload-hint">支持pdf类型的文件</p>
          </div>
        </Upload.Dragger>
      </Form.Item>

1.在beforeUpload方法中获取文件的url

kotlin 复制代码
const beforeUpload = async (file: FileType) => {
  //获取文件的url格式
  pdfSrc.value = URL.createObjectURL(file);
  if (file.size / 1024 / 1024 > 50) {
    message.error("文件大小不可超过50MB");
    return Upload.LIST_IGNORE;
  }
  if (filename !== ".pdf") {
    message.warn("请选择指定的文件格式");
    return;
  }
  return false;
};

2.实现预览方法

ini 复制代码
const getNumPages = () => {
  //创建加载任务
  let loadingTask = pdf.createLoadingTask(pdfSrc.value);
  loadingTask.promise
    .then((pdf: any) => {
     //获取pdf的页数
      numPages.value = pdf.numPages;
    })
    .catch((err: any) => {
      console.error("pdf 加载失败", err);
    });
  pv.value = true;
};

三.在弹窗中加载预览窗口

ini 复制代码
<Modal v-model:visible="pv" :width="700">
    <div v-if="pv">
      <VuePdfEmbed
        v-for="item in numPages"
        :key="item"
        :source="pdfSrc"
        class="vue-pdf-embed"
        :page="item"
        style="1"
      >
      </VuePdfEmbed>
    </div>
  </Modal>

效果图

相关推荐
用户84179481456几秒前
vxe-gantt table 甘特图如何设置任务视图每一行的背景色
vue.js
前端老宋Running2 分钟前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔2 分钟前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户4445543654264 分钟前
Android的自定义View
前端
WILLF5 分钟前
HTML iframe 标签
前端·javascript
枫,为落叶22 分钟前
Axios使用教程(一)
前端
小章鱼学前端27 分钟前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js
ohyeah28 分钟前
JavaScript 词法作用域、作用域链与闭包:从代码看机制
前端·javascript
流星稍逝30 分钟前
手搓一个简简单单进度条
前端
涔溪38 分钟前
实现将 Vue3 项目作为子应用,通过无界(Wujie)微前端框架接入到 Vue2 主应用中(Vue2 为主应用,Vue3 为子应用)
vue.js·前端框架·wujie