Vue3+TypeScript實(shí)現(xiàn)PDF預(yù)覽組件
簡(jiǎn)介
在現(xiàn)代的 Web 應(yīng)用中,預(yù)覽 PDF 文件是一個(gè)常見需求。本文介紹了一個(gè)基于 Vue3 和 TypeScript 的 PDF 預(yù)覽組件,該組件支持分頁(yè)預(yù)覽、打印和下載功能。
技術(shù)棧
- Vue3
- TypeScript
- Element Plus
- unocss
- vue-pdf-embed
功能特點(diǎn)
- 分頁(yè)預(yù)覽: 支持在不同的 PDF 頁(yè)面之間進(jìn)行切換。
- 打印: 提供直接在瀏覽器中打印 PDF 的功能。
- 下載: 用戶可以下載整個(gè) PDF 文檔。
- 顯示所有頁(yè): 提供一個(gè)選項(xiàng),用戶可以選擇查看所有頁(yè)面。
組件代碼
以下是組件的核心代碼:
<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 = () => {
// 如果在打印時(shí),打印頁(yè)面是本身的兩倍,在打印配置 頁(yè)面 設(shè)置 僅限頁(yè)碼為奇數(shù)的頁(yè)面 即可
pdfRef.value.print();
};
defineExpose({
open
});
</script>
<template>
<div>
<el-dialog v-model="dialogVisible" title="預(yù)覽" 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 }}頁(yè)</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>總結(jié)
通過(guò)組合 Vue3、TypeScript 和其他現(xiàn)代前端技術(shù),我們創(chuàng)建了一個(gè)功能豐富的 PDF 預(yù)覽組件。這個(gè)組件提供了用戶友好的分頁(yè)預(yù)覽、打印和下載功能,為開發(fā)者在 Web 應(yīng)用中集成 PDF 預(yù)覽提供了便捷的解決方案。
到此這篇關(guān)于Vue3+TypeScript實(shí)現(xiàn)PDF預(yù)覽組件的文章就介紹到這了,更多相關(guān)Vue3 TypeScript PDF預(yù)覽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue 使用 v-model 雙向綁定父子組件的值遇見的問(wèn)題及解決方案
這篇文章主要介紹了vue 使用 v-model 雙向綁定父子組件的值遇見的問(wèn)題及解決方案,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-03-03
不同場(chǎng)景下Vue中虛擬列表實(shí)現(xiàn)
虛擬列表用來(lái)解決大數(shù)據(jù)量數(shù)據(jù)渲染問(wèn)題,由于一次性渲染性能低,所以誕生了虛擬列表渲染,下面我們就來(lái)學(xué)習(xí)一下不同場(chǎng)景下Vue中虛擬列表是如何實(shí)現(xiàn)的吧2023-10-10
Element中el-table動(dòng)態(tài)合并單元格(span-method方法)
本文主要介紹了Element中el-table動(dòng)態(tài)合并單元格(span-method方法),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
想到頭禿也想不到的Vue3復(fù)用組件還可以這么hack的用法
這篇文章主要為大家介紹了想到頭禿也想不到的Vue3復(fù)用組件還可以這么hack的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
vue+element-ui表格自定義列模版的實(shí)現(xiàn)
本文主要介紹了vue+element-ui表格自定義列模版的實(shí)現(xiàn),通過(guò)插槽完美解決了element-ui表格自定義列模版的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
基于Vue自定義指令實(shí)現(xiàn)按鈕級(jí)權(quán)限控制思路詳解
這篇文章主要介紹了基于vue自定義指令實(shí)現(xiàn)按鈕級(jí)權(quán)限控制,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
vue中的stylus及stylus-loader版本問(wèn)題
這篇文章主要介紹了vue中的stylus及stylus-loader版本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
基于element-ui封裝可搜索的懶加載tree組件的實(shí)現(xiàn)
這篇文章主要介紹了基于element-ui封裝可搜索的懶加載tree組件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

