vue预览pdf文件的几种方法

文章目录

  • vue预览pdf集中方法
  • 方法一:
  • 方法二:
    • 展示效果:
    • 需要包依赖:
    • 代码:
  • 方法三:
    • 展示效果:
    • 需要包依赖:
    • 代码:
    • 自己调参数,选择符合自己的

vue预览pdf集中方法

我这里主要是用在vue3项目中,但是vue2或者react可以借鉴这里面的包依赖,应该也可以,可以尝试着写写,或者找其他方法。

方法一:

iframe:这种方法显示有点丑
展示效果就不展示了,就iframe,主要看你浏览器怎么识别了,你可以想象得到;

      <iframesrc="E:\\1.pdf"frameborder="0"style="width: 80%; height: 100vh; margin: auto; display: block"></iframe>

方法二:

展示效果:

在这里插入图片描述

需要包依赖:

    "pdfobject": "^2.2.12",

代码:

<template><a-layout class="layout"><Header /><a-layout-content class="main-container"><div class="topBtn"><div><a-button type="primary" @click="handleBack" ghost>返回上一页</a-button></div><div><a-button type="primary" @click="downPdf">下载说明书</a-button></div></div><div id="example1"></div></a-layout-content></a-layout>
</template><script lang="ts" setup>
import { getCurrentInstance, ref, onMounted, onUnmounted } from 'vue';
import { useRouter, useRoute, createWebHistory } from 'vue-router';
import Header from '/@/components/Header/index.vue';
const router = useRouter();
import { serverAddress } from '/@/serve/index';
const VITE_APP_URL = serverAddress();
import { download } from '/@/libs/utils/download';const handleBack = () => {router.go(-1);
};
var pdfobject = require('pdfobject');
// 参考网址, https://blog.csdn.net/liang_wf/article/details/101453932
let pdfPath = ref('http://192.168.11.50:8102/database/bio/load_file/BYimage/ncov.pdf');
const downPdf = () => {download(pdfPath.value, 'PDF报告.pdf');
};
onMounted(() => {var options = {height: '100%',pdfOpenParams: {view: 'FitH',page: '1',toolbar: '0',//   toolbar: '1',// pagemode: 'none',},};pdfobject.embed(pdfPath.value, '#example1', options);
});
</script><style lang="less" scoped>
#example1 {//   border: 1px solid red;//   width: 100%;//   display: block;//   margin: auto;height: calc(100vh - 146px - 19px);
}.layout {//   min-width: 1400px;min-height: 100vh;
}.main-container {flex-direction: row;padding: 19px 70px;background-color: @bg-color;.topBtn {// border: 1px solid red;height: 60px;line-height: 60px;display: flex;justify-content: space-between;}
}
</style>

方法三:

展示效果:

效果一:分页
在这里插入图片描述
效果二:不分页
在这里插入图片描述

需要包依赖:

    "vue-pdf-embed": "^1.1.6","vue3-pdfjs": "^0.1.6",

代码:

自己调参数,选择符合自己的

<template><div class="pdf-preview"><div class="page-tool"><div class="page-tool-item" @click="lastPage">上一页</div><div class="page-tool-item" @click="nextPage">下一页</div><div class="page-tool-item">{{ state.pageNum }}/{{ state.numPages }}</div><div class="page-tool-item" @click="pageZoomOut">放大</div><div class="page-tool-item" @click="pageZoomIn">缩小</div></div><div class="pdf-wrap"><vue-pdf-embed :source="state.source" :style="scale" class="vue-pdf-embed" :page="state.pageNum" /></div></div>
</template>
<script setup lang="ts">
import { reactive, computed } from "vue";
import VuePdfEmbed from "vue-pdf-embed/dist/vue3-pdf-embed";
import { createLoadingTask } from "vue3-pdfjs";const props = defineProps({pdfUrl: {type: String,required: true}
})// const emit = defineEmits<{ (event: 'getPdfUrl', name: string): void }>()
// const getPdfUrl = ()=>{
//   emit('getPdfUrl', props.pdfUrl)
// }const state = reactive({source: `http://192.168.11.50:8102/database/bio/load_file/BYimage/ncov.pdf`, // 预览pdf文件地址pageNum: 1, // 当前页面scale: 1, // 缩放比例numPages: 0, // 总页数
});const loadingTask = createLoadingTask(state.source);
loadingTask.promise.then((pdf: { numPages: number }) => {state.numPages = pdf.numPages;
});const scale = computed(() => `transform:scale(${state.scale})`)
function lastPage() {if (state.pageNum > 1) {state.pageNum -= 1;}
}
function nextPage() {if (state.pageNum < state.numPages) {state.pageNum += 1;}
}
function pageZoomOut() {if (state.scale < 2) {state.scale += 0.1;}
}
function pageZoomIn() {if (state.scale > 1) {state.scale -= 0.1;}
}</script>
<style lang="css" scoped>
.pdf-preview {position: relative;height: 100vh;padding: 20px 0;box-sizing: border-box;background-color: e9e9e9;
}.pdf-wrap {overflow-y: auto;
}.vue-pdf-embed {text-align: center;width: 515px;border: 1px solid #e5e5e5;margin: 0 auto;box-sizing: border-box;
}.page-tool {position: absolute;bottom: 35px;padding-left: 15px;padding-right: 15px;display: flex;align-items: center;background: rgb(66, 66, 66);color: white;border-radius: 19px;z-index: 100;cursor: pointer;margin-left: 50%;transform: translateX(-50%);
}.page-tool-item {padding: 8px 15px;padding-left: 10px;cursor: pointer;
}
</style>
<template><div class="pdf-preview"><!-- <div class="page-tool"><div class="page-tool-item" @click="lastPage">上一页</div><div class="page-tool-item" @click="nextPage">下一页</div><div class="page-tool-item">{{ state.pageNum }}/{{ state.numPages }}</div><div class="page-tool-item" @click="pageZoomOut">放大</div><div class="page-tool-item" @click="pageZoomIn">缩小</div></div> --><div class="pdf-wrap"><vue-pdf-embed :source="state.source" :style="scale" class="vue-pdf-embed" :page="state.pageNum" /></div></div>
</template>
<script setup lang="ts">
import { reactive, computed } from "vue";
import VuePdfEmbed from "vue-pdf-embed/dist/vue3-pdf-embed";
import { createLoadingTask } from "vue3-pdfjs";const props = defineProps({pdfUrl: {type: String,required: true}
})// const emit = defineEmits<{ (event: 'getPdfUrl', name: string): void }>()
// const getPdfUrl = ()=>{
//   emit('getPdfUrl', props.pdfUrl)
// }const state = reactive({source: `http://192.168.11.50:8102/database/bio/load_file/BYimage/ncov.pdf`, // 预览pdf文件地址});const loadingTask = createLoadingTask(state.source);
loadingTask.promise.then((pdf: { numPages: number }) => {state.numPages = pdf.numPages;
});const scale = computed(() => `transform:scale(${state.scale})`)
function lastPage() {if (state.pageNum > 1) {state.pageNum -= 1;}
}
function nextPage() {if (state.pageNum < state.numPages) {state.pageNum += 1;}
}
function pageZoomOut() {if (state.scale < 2) {state.scale += 0.1;}
}
function pageZoomIn() {if (state.scale > 1) {state.scale -= 0.1;}
}</script>
<style lang="css" scoped>
.pdf-preview {position: relative;height: 100vh;padding: 20px 0;box-sizing: border-box;background-color: e9e9e9;
}.pdf-wrap {overflow-y: auto;
}.vue-pdf-embed {text-align: center;width: 515px;border: 1px solid #e5e5e5;margin: 0 auto;box-sizing: border-box;
}.page-tool {position: absolute;bottom: 35px;padding-left: 15px;padding-right: 15px;display: flex;align-items: center;background: rgb(66, 66, 66);color: white;border-radius: 19px;z-index: 100;cursor: pointer;margin-left: 50%;transform: translateX(-50%);
}.page-tool-item {padding: 8px 15px;padding-left: 10px;cursor: pointer;
}
</style>

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

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

相关文章

第 9 章:理解C++内存模型

本章是继[第8章]讨论的延续&#xff0c;我们在那里讨论了一些多进程和多线程技术&#xff1b;本章将增强它们的使用。我们将引导你了解各种技术&#xff0c;同时聚焦于本章的主要内容——C内存模型。但为了讨论这一点&#xff0c;你首先将简要检视通过智能指针和可选对象实现的…

ZK鉴权设计以及相关探讨

文章目录 1. zk的鉴权设计2. zk鉴权应用范围3. zk鉴权的常用方法4. 推荐配置5. 参考文档 鉴权&#xff0c;分别由鉴和权组成 鉴&#xff1a; 表示身份认证&#xff0c;认证相关用户是否存在以及相关的用户名和密码是否一致权&#xff1a; 完成身份的鉴后&#xff0c;还需要判断…

DolphinScheduler + Amazon EMR Serverless 的集成实践

01 背景 Apache DolphinScheduler 是一个分布式的可视化 DAG 工作流任务调度开源系统&#xff0c;具有简单易用、高可靠、高扩展性、⽀持丰富的使用场景、提供多租户模式等特性。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方…

【C++】std::variant

上一篇文章讲到了 union&#xff0c;union union存在很多问题&#xff0c;因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…

Redis 安装 redistimeseries.so(时间序列数据类型)教程

配置步骤 1.下载 redistimeseries.so 文件 2.在 redis.conf 中增加配置 loadmodule /home/chenjian/redis-lib/RedisTimeSeries/redistimeseries.so DUPLICATE_POLICY LAST3.重启 Redis 服务 4.连接客户端&#xff0c;测试 RedisTimeSeries 相关命令&#xff0c;下图表明 R…

Java玩转《啊哈算法》排序之快速排序

心无挂碍&#xff0c;无挂碍故&#xff0c;无有恐怖&#xff0c;远离颠倒梦想&#xff0c;究竟涅槃。 地图 引子代码地址快速排序核心代码优劣完整代码演示 课后习题 引子 搭嘎好&#xff01;本人最近看的《啊哈算法》这本书写的确实不错&#xff0c;生动形象&#xff0c;在保…

安全耐用 一路稳行 极固轮胎3大系列产品重磅上市

临近年关&#xff0c;全国范围内雨雪天气多发&#xff0c;让极端天气环境下的行车安全再次成为热议话题。路面寒冷湿滑&#xff0c;交通事故频发&#xff0c;也让大家开始关注一个话题&#xff1a;如何确保汽车在湿滑路面上的安全系数&#xff1f;或者说&#xff0c;如果遭遇类…

如何让wordpress首页只显示某一篇文章全部内容?在您的主页显示选择

大多数WordPress站点首页默认都是显示最新发布的文章列表&#xff0c;不过有些站点比较特殊&#xff0c;只想显示某一篇文章的全部内容&#xff0c;那么应该怎么设置呢&#xff1f; 其实&#xff0c;WordPress后台 >> 设置 >> 阅读 >> 在“您的主页显示”中…

基于flask的个人博客项目从0到1

项目展示 首页 文章时间线页面 笔记页面 留言页面 关于页面 后台页面-文章管理 后台页面-笔记页面 后台页面-分类 后台管理-新增标签 后台管理-标签页面 后台管理-新增标签 后台管理-关于页面 2.项目详述 该博客开源地址点击跳转&#xff0c;该项目已部署上线&#xff0c;…

《HTML 简易速速上手小册》第8章:HTML 表单高级技术(2024 最新版)

文章目录 8.1 数据收集与处理8.1.1 基础知识8.1.2 案例 1&#xff1a;创建一个注册表单8.1.3 案例 2&#xff1a;创建一个调查问卷表单8.1.4 案例 3&#xff1a;创建一个动态添加输入字段的表单 8.2 定制化表单元素8.2.1 基础知识8.2.2 案例 1&#xff1a;创建一个带有定制选择…

【GAMES101】Lecture 12 阴影 Shadow Mapping

这里是光栅化的最后一部分&#xff0c;讲这个光栅化里面怎么实现这个阴影 实际上阴影就是光源看不到的地方但是是我们能看到的地方&#xff0c;那这个地方就应该有阴影&#xff0c;那具体怎么做呢&#xff0c;这个就叫做Shadow Mapping&#xff0c;分两步做 我们之前说过这个解…

Stable Diffusion系列(四):提示词规则与使用

文章目录 基础规则高级规则插件使用基于相机镜头增强提示词常用提示词总结奇特提示词珍藏 基础规则 所谓提示词&#xff0c;也就是文生图中的文&#xff0c;由连贯的英语单词或句子组成。其最基础的规则是&#xff1a; 不同提示词之间需要用英文逗号分隔&#xff0c;空格和换…

基于大数据的B站数据分析系统的设计与实现

摘要&#xff1a;随着B站&#xff08;哔哩哔哩网&#xff09;在国内视频分享平台的崛起&#xff0c;用户规模和数据量不断增加。为了更好地理解和利用这些海量的B站数据&#xff0c;设计并实现了一套基于Python的B站数据分析系统。该系统采用了layui作为前端框架、Flask作为后端…

mfc140.dll找不到了要怎么解决?教你多种修复mfc140.dll的方法

遭遇 mfc140.dll 文件缺失的状况时&#xff0c;首要任务是保持冷静&#xff0c;并深入理解问题所在&#xff0c;随后按照科学的方法来应对这一挑战。本篇文章概述了多种应对策略&#xff0c;从适合新手的基本步骤到针对有技术基础用户的高级方案&#xff0c;各种手段都能有效地…

linux系统查看占用cpu程序

目录 一&#xff1a;top 二&#xff1a; ps 三&#xff1a;perf 四&#xff1a;/proc/stat 五&#xff1a;pidstat 一&#xff1a;top 使用 top 命令&#xff1a;在终端中输入 top 命令&#xff0c;系统会显示当前正在运行的进程和它们的资源占用情况。默认情况下&#…

awk 文本处理工具三剑客

一、什么是awk 1.1 awk 基本概念 awk&#xff08;语言&#xff09;&#xff1a; 读取一行处理一行 是一个功能强大的编辑工具&#xff0c;逐行读取输入文本&#xff0c;默认以空格或tab键作为分隔符作为分隔&#xff0c;并按模式或者条件执行编辑命令。而awk比较倾向于将一行…

【网络】:网络套接字(UDP)

网络套接字 一.网络字节序二.端口号三.socket1.常见的API2.封装UdpSocket 四.地址转换函数 网络通信的本质就是进程间通信。 一.网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

vite+vue3+ts项目上线docker 配置反向代理API

这次重点的坑是反向代理。 1。项目中配置代理&#xff0c;为了跨域请求数据 项目根目录中新建vite.config.ts文件 在文件中添加配置代理 注意&#xff1a;其中 /api 和target 的地址后面没有 / 2。在项目根目录中新建Httprequest.ts文件&#xff0c;引入axios&#xff0c;并…

Kotlin快速入门系列8

Kotlin的泛型 与Java一样&#xff0c;Kotlin也提供泛型。泛型&#xff0c;即 "参数化类型"&#xff0c;将类型参数化&#xff0c;可以用在类&#xff0c;接口&#xff0c;方法上。可以为类型安全提供保证&#xff0c;消除类型强转的烦恼。声明泛型类的格式如下&…