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

news2024/12/23 3:03:04

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

      • 效果图
      • 引入pdf插件
      • pdf页面封装
      • 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存放目录

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

饮料市场京东销售数据分析(京东大数据)

近日&#xff0c;关于“阿斯巴甜可能是致癌物”的话题持续发酵&#xff0c;众所周知阿斯巴甜是常见的人工甜味剂之一&#xff0c;并被广泛应用于无糖可乐以及一些饮料产品中&#xff0c;而这一话题引起人们的巨大恐慌。 阿斯巴甜致癌与否尚未定论&#xff0c;但这一言论也引得…

【学习笔记-QGIS】 QGIS从零快速上手

原文感谢作者才华横溢吴道简 安装文章参考&#xff1a;https://zhuanlan.zhihu.com/p/370633306 一、下载安装 QGIS免费开源&#xff0c;中文界面&#xff0c;下载地址&#xff1a;https://download.qgis.org/downloads/ 三、配置中文环境 开始——QGIS 3.18——QGIS Deskto…

SpringBoot2+Vue2实战(十)权限管理之动态菜单、动态路由生成

一、父子菜单实现 新建数据库表 sys_menu sys_role 实体类 Role import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;import l…

Numpy速通笔记

Numpy可以高效处理大数组的数据&#xff0c;因为&#xff1a; Numpy在一个连续的内存块中存储数据&#xff0c;独立于其他Python内置对象。Numpy是C写的&#xff0c;有优化&#xff0c;比Python内置序列使用的内存少可以在整个数组上进行复杂运算&#xff0c;不需要for循环 下…

table的tr动态增加(含html示例)

html页面table的tr动态增加&#xff08;含示例&#xff09; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>简单示例</title><script type"text/javascript">function …

陶建辉在“2023 可信数据库发展大会”发表演讲,TDengine 入选中国数据库产业图谱

当前&#xff0c;全球数字经济加速发展&#xff0c;数据正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关键力量。数据库作为存储与处理数据的关键技术&#xff0c;在数字经济大浪潮下&#xff0c;全球数据库产业中新技术、新业态、新模式不断涌现。 7 月 4…

mysql创建表练习

CREATE TABLE student ( Id int(10) primary key auto_increment comment "学号", Name varchar(20) not null comment "姓名", Sex enum(M,F) default M comment "性别", Birth year(4) comment "出生年份", Department varchar(20)…

-XX:+PrintCommandLineFlags

-XX:PrintCommandLineFlags把传递给虚拟机的参数输出&#xff08;隐式传递显式传递&#xff09;控制台打印信息-XX:ConcGCThreads3 -XX:G1ConcRefinementThreads13 -XX:GCDrainStackTargetSize64 -XX:InitialHeapSize254884992 -XX:MarkStackSize4194304 -XX:MaxHeapSize407815…

从混沌到秩序的蜕变,SRE解码云计算运维奥秘

什么是SRE SRE&#xff08;Site Reliability Engineering&#xff09;即站点可靠性工程&#xff0c;最初由Google公司提出&#xff0c;通过将开发、运维等多方面进行整合&#xff0c;协同推进系统可靠性&#xff0c;从而确保业务服务能够持久运行。 这是一种新的模式&#xff0…

7.6机试练习

1. 2105 IP Address 描述 Suppose you are reading byte streams from any device, representing IP addresses. Your task is to convert a 32 characters long sequence of ‘1s’ and ‘0s’ (bits) to a dotted decimal format. A dotted decimal format for an IP addres…

视频关键帧AI化的多种方法

视频关键帧AI化的逻辑是将视频切分成一帧帧的画面&#xff0c;然后使用SD绘画固定风格&#xff0c;最后统一在拼接在一起成为一个新的视频。 不管是Mov2Mov还是Multi Frame都能制作这种视频。但是这些操作起来比较麻烦&#xff0c;经过尝试处理较稳定的方法是可以通过img2im的…

Win10电脑开机PIN码怎么取消?

有的用户稀里糊涂的设置了PIN码之后&#xff0c;在开机时发现多了个PIN码&#xff0c;但又不知道电脑PIN码是什么意思&#xff0c;也不清楚开机PIN码怎么取消。您可以通过阅读以下内容&#xff0c;以了解什么是PIN以及如何取消PIN码。 PIN码是一种快捷登录密码方式&#xff0c;…

第九章、vim程序编辑器

9.1 vi与vim 9.1.1 为何要学vim 所有的 Unix Like 系统都会内置 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在&#xff1b; 很多个别软件的编辑接口都会主动调用 vi &#xff08;例如未来会谈到的 crontab, visudo, edquota等指令&#xff09;&#xff1b; vi…

最新版Flink CDC MySQL同步MySQL(一)

1.概述 Flink CDC 是Apache Flink 的一组源连接器&#xff0c;使用变更数据捕获 (CDC) 从不同数据库中获取变更。Apache Flink 的 CDC Connectors集成 Debezium 作为捕获数据更改的引擎。所以它可以充分发挥 Debezium 的能力。 2.支持的连接器 连接器数据库驱动mongodb-cdc…

深度学习神经网络学习笔记-论文研读-transformer及代码复现参考

摘要 优势序列转导模型基于复杂的循环或包括一个编码器和一个解码器的卷积神经网络。最好的表现良好的模型还通过attention 连接编码器和解码器机制。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c; 完全基于注意力机制&#xff0c;省去了递归和卷积完…

在一个呼号前+B1/是啥意思?有人知道吗?

电台呼号有什么意义&#xff1f;呼号指配意义在于&#xff0c;识别各个不同的具体的电台或同一固定电台内使用2个以上频率时&#xff08;包括两个频率&#xff09;来识别每个不同频率&#xff0c;另外电台的类别和性质也取决于其呼号的组成形式&#xff0c;所以呼号一经确定&am…

Mycat2 使用教程(三)原始数据导入分库分表【MySQL分库分库分表】

Mycat2 使用教程&#xff08;三&#xff09;原始数据导入分库分表【MySQL分库分库分表】 本文主要描述mycat2完成分库分别数据源配置后&#xff0c;将数据导入的过程mysql 分库分表如果是新项目&#xff0c;则不用考虑本文内容mycat2如何配置分库分表&#xff1f;见上文 1.计…

排序链表问题

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1a;…

Hadoop下载安装(物理机)

1、下载Hadoop安装包## http://archive.apache.org/dist/hadoop/common 2、解压安装Hadoop 将hadoop-2-7.4.tar.gz包上传到/root/export/software目录 cd /root/export/software mkdir /root/exprot/servers tar -zxvf hadoop-2.7.4.tar.gz -C /root/export/servers/3、配置…

第三届DeepModeling黑客松竞赛

今年的Hackathon难度梯度设置很广&#xff0c;有偏向硬核开发的&#xff0c;有偏向应用的&#xff0c;还有面向初学者的教学布道赛道&#xff01;欢迎大家来围观&#xff01; 参赛链接