从零开始Vue3+Element Plus后台管理系统(十四)——PDF预览和打印

news2025/1/20 3:42:19

其实我常常会纠结今天要写什么内容。

因为希望能够保持每日更新,所以要写的内容不能太难——最好是半天可以搞出demo并且输出文章,所以很多东西浅尝辄止,并没有深入研究,还写出了一些bug 🐛

今天又浅浅的研究了下在Vue3中如何预览PDF

image.png

vue-pdf-embed

刚开始尝试 vue3-pdfjs,可以很快做出预览界面,但它没有自带打印功能,所以继续在github中翻啊翻。

最终选择了vue-pdf-embed https://github.com/hrynko/vue-pdf-embed#examples,它的功能强大一些,可以满足预览和打印的功能。

npm install vue-pdf-embed

缩放

初始化时获取容器宽度,把组件的width设为容器宽度数值,然后通过调整width的值来控制缩放。

// 设置初始宽度
onMounted(() => {
  wpWidth = wpRef.value.clientWidth
  width.value = wpWidth
})

function zoom(type: number) {
  if ((scale.value < 0.3 && type === -1) || (scale.value > 5 && type === 1)) return

  scale.value = scale.value + type * 0.1
  width.value = scale.value * wpWidth
}

打印

调用print(),配置参数

print resolution (number) 分辨率,
filename (string),
all pages flag (boolean)


function print() {
  pdfRef.value.print(150, null, true)
}

image.png

完整代码

<!-- 样式使用了tailwind CSS -->
<template>
  <div class="m-4 shadow"> 
  <!-- v-adaptive是自定义的一个指令,详见:https://juejin.cn/post/7232106423244243002 -->
    <div v-adaptive>
      <vue-pdf-embed
        ref="pdfRef"
        :source="pdfSource"
        :page="page"
        :width="width"
        class="transition-all"
        @password-requested="handlePasswordRequest"
        @rendered="handleDocumentRender"
      />
    </div>

    <div class="flex items-center justify-center py-2" ref="wpRef">
      <el-button :disabled="page <= 1" @click="page--"></el-button>
      <span class="mx-4">{{ page }} / {{ pageCount }}</span>
      <el-button :disabled="page >= pageCount" @click="page++"></el-button>

      <i-ep:zoom-out
        @click="zoom(-1)"
        class="ml-8 text-lg cursor-pointer"
        :class="scale < 0.3 ? 'text-gray-300 cursor-not-allowed	' : ''"
      ></i-ep:zoom-out>
      <i-ep:zoom-in
        @click="zoom(1)"
        class="ml-4 text-lg cursor-pointer"
        :class="scale > 5 ? 'text-gray-300 cursor-not-allowed	' : ''"
      ></i-ep:zoom-in>

      <el-button @click="print" class="ml-8">打印</el-button>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import VuePdfEmbed from 'vue-pdf-embed'

const pdfRef = ref()
const wpRef = ref()

let pdfSource = ref('/L16 心动-编配谱.pdf')
let isLoading = ref(true)
let page = ref(1)
let scale = ref(1)
let pageCount = ref(0)
let wpWidth = 0
let width = ref(0)

onMounted(() => {
  wpWidth = wpRef.value.clientWidth
  width.value = wpWidth
})

function handleDocumentRender() {
  isLoading.value = false
  pageCount.value = pdfRef.value.pageCount
}

function zoom(type: number) {
  if ((scale.value < 0.3 && type === -1) || (scale.value > 5 && type === 1)) return

  scale.value = scale.value + type * 0.1
  width.value = scale.value * wpWidth
}

function print() {
  pdfRef.value.print(150, null, true)
}
function handlePasswordRequest(callback: any, retry) {
  callback(prompt(retry ? 'Enter password again' : 'Enter password'))
}
</script>

项目地址

本项目GIT地址:github.com/lucidity99/…

如果有帮助,给个star ✨ 点个赞👍

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

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

相关文章

这还只是阿里20K+测试岗面试题,看的我冷汗直流.....

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在3月中的时候他告诉我投递了阿里巴巴并且简历已通过&#xff0c;3月23经过…

python类型注释

目录 为什么需要类型注解 什么是类型注解 联合注解 使用注解时的注意点 为什么需要类型注解 看下图&#xff0c;很精炼&#xff1b; 什么是类型注解 Python类型注释是指在变量、函数参数、返回值等位置添加类型信息的一种语法&#xff0c;其目的是提高代码的可读性和可维护…

monkey测试方法及命令

1、查询测试包信息 # 查看已连接设备 adb devices # 带uuid查询包含test的第三方apk包 adb -s W21112003057 shell pm list package -3 | grep test # 清空logcat adb -s W21112003057 logcat -c # 启动app&#xff0c;通过日志查看安装包信息 adb -s W21112003057 logcat…

史上最全!全领域网络安全拓扑图(118页)

大家好&#xff0c;我是老杨。 前几天发了一篇OSPF的文章&#xff0c;助理发到群里和大家讨论。 好几个小友表示&#xff0c;绘制拓扑的才是最高境界&#xff0c;并且想看些拓扑图案例。 其实拓扑图案例老杨也分享过不少了。 可以看看这些往期文章&#xff0c;《超干货&…

【送书福利-第四期】从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 送书福利-第四期 一、前言二、书籍介绍抽…

KY111 日期差值

1.题目&#xff1a; 2.分析&#xff1a; 1. 分别求出每一个日期与0000年0月1日距离的天数 2. 两个距离天数相减即可得到两个日期相差的天数 3.我的代码&#xff1a; #include <iostream> using namespace std;class Date { public:Date(int year 1, int month 1, …

java学习:字面量,基本语句

一、字面量 1.字面量的类型 Java字面量的类型其实跟 c 的有点相似&#xff0c;有一点不一样的就是&#xff0c;Java有个null类型&#xff0c;注意这个没有大写 2.特殊字面量 \t 是制表符&#xff0c;它的作用就是补齐一个字符串到8位&#xff0c;这样就会使输出结果变得美观…

【arxiv】关于 SAM 的论文扫读(一)

文章目录 一、阴影检测二、弱监督下的隐蔽物体分割&#xff1a;基于SAM的伪标签和多尺度特征分组三、Instruct2Act&#xff1a;利用大型语言模型将多模态指令映射到机器人动作四、OR-NeRF: Object Removing from 3D Scenes Guided by Multiview Segmentation with Neural Radia…

Lucene(5):索引维护

1 需求 管理人员通过电商系统更改图书信息&#xff0c;这时更新的是关系数据库&#xff0c;如果使用lucene搜索图书信息&#xff0c;需要在数据库表book信息变化时及时更新lucene索引库。 2 添加索引 调用 indexWriter.addDocument&#xff08;doc&#xff09;添加索引。 参…

[Data structure]环形链表

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一…

文心一言 VS chatgpt (21)-- h264编码一帧数据的流程是怎样的?

h264编码一帧数据的流程是怎样的&#xff1f; 文心一言&#xff1a; H.264编码将一帧数据分成多个块&#xff0c;其中每个块可以单独进行编码。编码的过程包括预测、变换和量化等步骤。 具体流程如下&#xff1a; 1.帧内预测&#xff1a;对一帧视频进行编码&#xff0c;首先…

什么是网络编程

目录 一、什么是网络编程&#xff1f; 二、协议 1.用户数据报协议(User Datagram Protocol) 2.TCP协议 TCP三次握手过程 三、实例 1.UDP通信程序 实现步骤 TCP接收数据 四、TCP协议和UDP协议的区别和联系 一、什么是网络编程&#xff1f; 1.在网络通信协议下&#xf…

Qt编程基础 | 常用控件 | 组合框

一、组合框 1.1、定义 QComboBox提供了一种向用户呈现选项列表的方式&#xff0c;以占用最少的屏幕空间。 组合框是一个显示当前项目的选择小部件&#xff0c;可以弹出可选择项目的列表。 组合框可以是可编辑的&#xff0c;允许用户修改列表中的每个项目。 QComboBox 除了显示…

四、IOC容器(3)

一、IOC操作Bean管理&#xff08;外部属性文件&#xff09; 1.直接配置数据库信息 配置德鲁伊连接池引入德鲁伊连接池依赖jar包 <!--配置连接池--> <bean id"dataSource" class"com.alibaba.druid.pool.DruidDataSource"><property name&…

深度学习神经网络学习笔记-多模态方向-10-Neural Voice Cloning with a Few Samples

摘要 语音克隆是个性化语音接口非常需要的功能。我们介绍了一个神经语音克隆系统&#xff0c;该系统仅从少数音频样本中学习合成一个人的声音。我们研究了两种方法:说话人适应和说话人编码。说话人自适应是基于多说话人生成模型的微调。说话人编码是基于训练一个单独的模型来直…

GitLab CI/CD

CI/CD 简介 CI/CD 简单来说就是可以自动化编译、测试、打包我们的代码。 GitLab CICD的使用 首先需要安装gitlab-runner。 在GitLab 中&#xff0c;runners 是运行 CI/CD 作业的代理。我们的对代码的作业都是在runner上去执行的。我们可以在本地、服务器、等任意一个联网设…

chatgpt赋能Python-python_chat

Python Chat: 使用Python编程语言打造聊天应用 在当今数字化的时代&#xff0c;人们需要有一种跨越地域和时间的即时通讯方式&#xff0c;这就是聊天应用的用武之地。Python编程语言因其易读易写的特性&#xff0c;和广泛的社区支持成为了许多开发者的首选。Python Chat是一款…

2023年CentOS镜像下载地址,包括CentOS官网、国内镜像下载,超详细教学,小白也能学会。

目录 1.CentOS官网镜像下载 1.1进入CentOs官网镜像下载地址 1.2找到需要下载的版本 1.3选择isos镜像文件夹 1.4选择架构 1.5下载种子文件 2.阿里云开源镜像站下载 2.1进入阿里云开源镜像站下载地址 2.2找到需要下载的版本 2.3选择isos镜像文件夹 2.4选择架构​ 2.5…

vue3学习手册

vue3 1.认识vue31.1了解相关信息1.2 性能提升:1.3 新增特性1.4 使用 vue-cli 创建vue项目1.5 使用 vite 创建 2.全局api2.1 createApp()2.2 app.mount()2.3 app.unmount()2.4 app.provide()2.5 app.component()2.6 app.use()2.7 app.version2.8 app.config2.9 app.config.error…

阿拉德手游服务端Centos搭建教程

阿拉德手游服务端Centos搭建教程 大家好我是艾西&#xff0c;又有几天没有更新文章了。这几天看了看还是有不少人对手游感兴趣&#xff0c;今天给大家分享一款早些年大火的pc游戏&#xff0c;现在也有手游了“阿拉德”。 你是否还记得DNF&#xff0c;一天你不小心救了赛丽亚&a…