Vue3+TypeScript实现PDF预览组件

 更新时间:2024年04月23日 16:22:31   作者:下雨会打伞的前端  
这篇文章主要为大家详细介绍了如何基于Vue3+TypeScript实现PDF预览组件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

简介

在现代的 Web 应用中,预览 PDF 文件是一个常见需求。本文介绍了一个基于 Vue3 和 TypeScript 的 PDF 预览组件,该组件支持分页预览、打印和下载功能。

技术栈

  • Vue3
  • TypeScript
  • Element Plus
  • unocss
  • vue-pdf-embed

功能特点

  • 分页预览: 支持在不同的 PDF 页面之间进行切换。
  • 打印: 提供直接在浏览器中打印 PDF 的功能。
  • 下载: 用户可以下载整个 PDF 文档。
  • 显示所有页: 提供一个选项,用户可以选择查看所有页面。

组件代码

以下是组件的核心代码:

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

const pdfUrl = "https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf";

const dialogVisible = ref(false);
const loading = ref(false);
const pdfRef = ref();
const source = ref("");
const currentPage = ref<number | undefined>(1);
const pageCount = ref(1);
const showAllPages = ref(false);

const open = (url: string = pdfUrl) => {
	source.value = url;
	dialogVisible.value = true;
	loading.value = true;
};

const documentRender = () => {
	loading.value = false;
	pageCount.value = pdfRef.value.doc.numPages;
};

const showAllPagesChange = () => {
	currentPage.value = showAllPages.value ? undefined : 1;
};

const handleDownload = () => {
	pdfRef.value.download();
};

const handlePrint = () => {
	// 如果在打印时,打印页面是本身的两倍,在打印配置 页面 设置 仅限页码为奇数的页面 即可
	pdfRef.value.print();
};

defineExpose({
	open
});
</script>

<template>
	<div>
		<el-dialog v-model="dialogVisible" title="预览" width="80%" align-center destroy-on-close>
			<div flex="~ justify-between items-center">
				<div>
					<el-pagination
						v-if="!showAllPages"
						v-model:current-page="currentPage"
						layout="prev, pager, next"
						:page-size="1"
						:total="pageCount"
						hide-on-single-page
					/>
					<div v-else>共{{ pageCount }}页</div>
				</div>
				<div flex="~ items-center">
					<el-checkbox v-model="showAllPages" @change="showAllPagesChange">展示所有</el-checkbox>
					<el-tooltip effect="dark" content="下载">
						<SvgIcon
							ml-2
							color="#000"
							cursor-pointer
							@click="handleDownload"
							:icon-style="{ width: '20px', height: '20px' }"
							name="download"
						/>
					</el-tooltip>
					<el-tooltip effect="dark" content="打印">
						<SvgIcon
							ml-2
							color="#000"
							cursor-pointer
							@click="handlePrint"
							:icon-style="{ width: '20px', height: '20px' }"
							name="printing"
						/>
					</el-tooltip>
				</div>
			</div>
			<el-scrollbar mt-3 height="75vh" v-loading="loading">
				<vue-pdf-embed ref="pdfRef" container overflow-auto :source="source" :page="currentPage" @rendered="documentRender" />
			</el-scrollbar>
		</el-dialog>
	</div>
</template>

<style lang="scss" scoped></style>

总结

通过组合 Vue3、TypeScript 和其他现代前端技术,我们创建了一个功能丰富的 PDF 预览组件。这个组件提供了用户友好的分页预览、打印和下载功能,为开发者在 Web 应用中集成 PDF 预览提供了便捷的解决方案。

到此这篇关于Vue3+TypeScript实现PDF预览组件的文章就介绍到这了,更多相关Vue3 TypeScript PDF预览内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue项目中封装echarts的优雅方式分享

    vue项目中封装echarts的优雅方式分享

    在实际项目开发中,我们会经常与图表打交道,比如 订单数量表、商品销量表、会员数量表等等,它可能是以折线图、柱状图、饼状图等等的方式来展现,下面这篇文章主要给大家介绍了关于vue项目中封装echarts的优雅方式的相关资料,需要的朋友可以参考下
    2022-03-03
  • vue实现滑动超出指定距离回顶部功能

    vue实现滑动超出指定距离回顶部功能

    这篇文章主要为大家详细介绍了vue实现滑动超出指定距离回顶部功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • vue v-for中key的原理详析

    vue v-for中key的原理详析

    key属性可以用来提升v-for渲染的效率,vue中使用v-for渲染数据的时候,并不会去改变原有的元素和数据,下面这篇文章主要给大家介绍了关于vue v-for中key原理的相关资料,需要的朋友可以参考下
    2022-04-04
  • vue实现购物车全部功能的简单方法

    vue实现购物车全部功能的简单方法

    vue是前端轻量级MVVM框架,入门门槛相对较低,今天用Vue做一个购物车实例,所以下面这篇文章主要给大家介绍了关于vue实现购物车全部功能的简单方法,需要的朋友可以参考下
    2021-07-07
  • vue数据传递--我有特殊的实现技巧

    vue数据传递--我有特殊的实现技巧

    这篇文章主要介绍了vue数据传递一些特殊梳理技巧,需要的朋友可以参考下
    2018-03-03
  • 基于iview-admin实现动态路由的示例代码

    基于iview-admin实现动态路由的示例代码

    这篇文章主要介绍了基于iview-admin实现动态路由的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Vue实现可移动水平时间轴

    Vue实现可移动水平时间轴

    这篇文章主要为大家详细介绍了Vue实现可移动水平时间轴,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 使用vue自定义如何实现Tree组件和拖拽功能

    使用vue自定义如何实现Tree组件和拖拽功能

    这篇文章主要介绍了使用vue自定义如何实现Tree组件和拖拽功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • vue使用自定义指令实现一键复制功能

    vue使用自定义指令实现一键复制功能

    在Vue中,通过自定义指令v-copy和document.execCommand方法,可以实现点击按钮复制内容到剪贴板的功能,适用于处理长文本或多行文本的复制需求,而readonly属性可避免内容被修改和移动设备上的虚拟键盘干扰,感兴趣的朋友一起看看吧
    2024-09-09
  • 解决vue项目中type=”file“ change事件只执行一次的问题

    解决vue项目中type=”file“ change事件只执行一次的问题

    这篇文章主要介绍了vue项目中解决type=”file“ change事件只执行一次的问题,本文给大家介绍的非常详细,需要的朋友可以参考下
    2018-05-05

最新评论