vue3项目打开本地pdf文件实现方法

2023-11-03

vue3项目打开本地pdf文件实现方法

效果图

请添加图片描述

引入pdf插件

注意一定要这个版本,不然会报错key.split(...).at is not a function

 npm install pdfjs-dist@2.12.313

pdf页面封装

<template>
  <div class="pdf-container">
    <canvas
      v-for="page in pdfPages"
      :key="page"
      :id="`pdf-canvas-${page}`" />
    <el-backtop :right="100" :bottom="100">
      <div class="backtop">返回顶部</div>
    </el-backtop>
  </div>
</template>

<script setup>
//一定要引入下面两个依赖文件
import * as PdfJs from 'pdfjs-dist';
import * as worker from 'pdfjs-dist/build/pdf.worker.entry';

import { nextTick, ref, watchEffect } from 'vue';
import { useRoute, useRouter } from 'vue-router';//引入路由
  
const route = useRoute();

let pdfDoc = null;        // pdf整体实例
const pdfPages = ref(0);  // pdf文件总页数
const pdfScale = ref(2.0);// pdf文件预览缩放

const loadFile = (url) => {
  PdfJs.GlobalWorkerOptions.workerSrc = worker;
  // PdfJs.disableWorker = true;
  //通过getDocument获取到PDf文档
  const loadingTask = PdfJs.getDocument(url);
  loadingTask.promise.then((pdf) => {
    pdfDoc = pdf; // 文件流
    pdfPages.value = pdf.numPages; // 文件总页数
    nextTick(() => {
      renderPage(1);
    });
  })
  .catch((error) => {
    console.log(error);
  });
};
const renderPage = (num) => {
  // 页数检测
  if (num <= 0 || num > pdfPages.value) {
    return;
  }
  pdfDoc.getPage(num).then((page) => {
    const canvas = document.getElementById(`pdf-canvas-${num}`);
    const ctx = canvas.getContext('2d');
    //dpr和bsr设置pdf的比例尺寸
    const dpr = window.devicePixelRatio || 1;
    const bsr = ctx.webkitBackingStorePixelRatio ||
                ctx.mozBackingStorePixelRatio ||
                ctx.msBackingStorePixelRatio ||
                ctx.oBackingStorePixelRatio ||
                1;
    const ratio = dpr / bsr;
    const viewport = page.getViewport({ scale: pdfScale.value }); // 文件显示比例
    canvas.width = viewport.width * ratio;
    canvas.height = viewport.height * ratio;
    canvas.style.width = viewport.width + 'px';
    canvas.style.height = viewport.height + 'px';
    ctx.setTransform(ratio, 0, 0, ratio, 0, 0); // 设置当pdf文件处于缩小或放大状态时,可以拖动

    // 将pdf文件的内容渲染到canvas中
    const renderContext = {
      canvasContext: ctx,
      viewport: viewport
    };
    page.render(renderContext);

    if (num < pdfPages.value) {
      renderPage(num + 1);
    }
  })
  .catch((error) => {
    console.log(error);
  });
};

watchEffect(() => {
  //我这里是菜单直接跳转,所以通过获取路由
  let pdfUrl = `/pdfs${route.query.pdfUrl}`;
  loadFile(pdfUrl);
});
</script>

<style scoped>
.pdf-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
  height: 100%;
}
.backtop {
  height: 100%;
  width: 100%;
  background-color: #ffffff;
  box-shadow: 0px 0px 6px rgba(0, 0, 0, .12);
  text-align: center;
  line-height: 20px;
  font-size: 16px;
  color: #1989fa;
}
</style>

pdf存放目录

在这里插入图片描述
具体实现就这么多,欢迎来吐槽!

结语

一个人久了连喜欢上一个人都好难,不要轻易地拒绝学习新知,因为你所拒绝的不是别人,而是你自己的成长之路。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3项目打开本地pdf文件实现方法 的相关文章

随机推荐

  • 合并两个无序数组java_Java实现把两个数组合并为一个的方法总结

    Java实现把两个数组合并为一个的方法总结 发布时间 2020 10 25 10 40 46 来源 脚本之家 阅读 76 作者 jaycee110905 本文实例讲述了Java实现把两个数组合并为一个的方法 分享给大家供大家参考 具体如下
  • 数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据

    MATLAB 读取数字字符串混杂的文本文件txt中的数据 目标 介绍 纯数字的情况 需要读取的文本文件 判断文件路径 matlab 读取数据的结果 代码块 文字开头 数字在后的情况 需要读取的文本文件 matlab 读取数据的结果 代码块
  • cmake--编译器设置

    前言 cmake支持多种不同方式设置编译器标志 1 使用 target compile definitions 设置编译器标志 2 使用CMAKE C FLAGS和CMAKE CXX FLAGS设置编译标志 一 目录结构 CMakeList
  • 复习C语言指针---函数指针

    复习C语言指针 函数指针 文章目录 复习C语言指针 函数指针 函数 函数指针 函数指针数组 回调函数 结束语 函数 一个函数表达式其实是不存在直接的 操作符的 操作符要求操作数是函数指指针 或者一些类类型 实际上 当用 f1 这样调用f1时
  • 华为服务器系统崩了怎么办,服务器崩溃重装系统

    服务器崩溃重装系统 内容精选 换一换 裸金属服务器操作系统无法正常启动 操作系统中毒 或裸金属服务器系统运行正常 但需要对系统进行优化 使其在最优状态下工作时 用户可以使用重装裸金属服务器的操作系统功能 重装操作系统是以原镜像进行系统重装
  • jackson 驼峰注解_springboot jackjson驼峰转下划线

    有如下几种方法 1 通过ObjectMapper设置 mapper setPropertyNamingStrategy com fasterxml jackson databind PropertyNamingStrategy SNAKE
  • C++ 模板

    模板是泛型编程的基础 泛型编程即以一种独立于任何特定类型的方式编写代码 模板是创建泛型类或函数的蓝图或公式 库容器 比如迭代器和算法 都是泛型编程的例子 它们都使用了模板的概念 每个容器都有一个单一的定义 比如 向量 我们可以定义许多不同类
  • springboot整合Redis时spring.redis.database参数不生效

    问题描述 配置配件中配置redis的database参数无论配置什么值时都是默认的0 网上查阅大量资料没有查到原因 解决 在网上找到了此网友的回答 虽然没有直接帮助我们解决问题 但给我提供了解决问题的思路 从这图阔以看出redis的data
  • PCL分割方法:区域生长分割算法(RegionGrowing)

    转载 有梦想的田园犬 https blog csdn net AmbitiousRuralDog article details 80267519
  • 数字信号处理基础----傅里叶级数

    1 傅里叶级数的余弦形式 1 1 正交的三角函数集 三角函数集 1 2 2 1 2 3 内的函数在区间 上彼此正交 也即 任意两个不同的函数的内积为0 函数和自身的内积不为零 因此 函数可以由该正交函数集唯一的表示 1 2 傅里叶级数的定义
  • vite+vue3打包部署问题

    最近使用vite vue3写了个小的demo 发现打包部署后页面出不来 如果是正常把包放在服务器的根目录中 项目页面是可以打开的 但是我要部署的是根目录dist包里面 外面多了一层文件夹 解决 vite config ts文件 base z
  • 横向手风琴效果

    html
  • 华硕a501lb5200加内存和固盘并装上win7系统并设置固盘为第一启动

    华硕a501lb5200加内存和固盘并装上win7系统并设置固盘为第一启动 最近入手一只华硕a501lb5200 然后某宝上买内存 固盘 接着拆机加内存和固盘并装上win7系统 于是想分享下自己的经验 大家多多补充 1 拆机加内存和固盘 内
  • Redis集群主从复制不生效的问题分析及解决

    一 集群信息 Redis版本 5 0 集群规模 三主三从 二 基本情况 在项目中为了达到高可用的目的 使用了Redis集群 搭建过程同Redis Cluster集群原理 三主三从交叉复制实战 故障切换 但是在实际使用中发现 集群方式比单点模
  • discuz未登录情况下首页tdk显示“首页”

    问题 discuz未登录状态下首页tdk与后台设置的不符 如图问题keywords和description变成了门户 也有部分变成了首页 解决办法 用编辑器打开 source class helper下的helper seo php文件 找
  • LeetCode#88. 合并两个有序数组(Python)

    题目 来源力扣 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同样按 非递减顺序
  • 很全的 Java 权限认证框架

    今天给大家推荐的这个开源项目超级棒 可能是史上功能最全的 Java 权限认证框架 这个开源项目就是 sa token Sa Token是什么 sa token是一个轻量级Java权限认证框架 主要解决 登录认证 权限认证 Session会话
  • FATFS:一个兼容windows的嵌入式文件系统API使用详解

    FATFS 一个兼容windows的嵌入式文件系统API使用详解 目录 FATFS 一个兼容windows的嵌入式文件系统API使用详解 1 API分类 2 常用API说明 2 1 挂载文件系统与解除挂载 2 2 文件操作 2 2 1 文件
  • arduino 1 读取电机编码器值

    define BAUDRATE 115200 define LEFT 0 左轮 define RIGHT 1 右轮 define FORWARDS true define BACKWARDS false 如果一个变量所在的代码段可能会意外地
  • vue3项目打开本地pdf文件实现方法

    vue3项目打开本地pdf文件实现方法 效果图 引入pdf插件 pdf页面封装 pdf存放目录 结语 效果图 引入pdf插件 注意一定要这个版本 不然会报错key split at is not a function npm install