Vue 3 實戰:從零到一用 vue-pdf-embed 打造功能齊全的 PDF 查看器

你好,Vue?開發者們!

在 Web 開發中,我們經常會遇到需要在頁面中直接展示?PDF?文件的需求,例如預覽合同、顯示報告或在線閱讀文檔。你可能會想到用?<iframe>?或者一些重量級的庫,但它們往往不夠靈活或過于臃腫。

今天,我將向你介紹一個輕量、強大且對?Vue 3?非常友好的解決方案——vue-pdf-embed

🤔?vue-pdf-embed?是什么?

vue-pdf-embed?是一個專門為 Vue 設計的 PDF 查看器組件。它基于 Mozilla 的?PDF.js,但去除了所有不必要的 UI 和復雜性,只專注于提供一個純粹、高性能的 PDF 渲染核心。

核心亮點:

  • 📦?輕量級:只包含渲染 PDF 所需的核心邏輯,打包體積小。
  • 🖼??高質量渲染:利用 PDF.js,確保 PDF 內容清晰、準確地顯示。
  • 📱?響應式:能夠很好地適應不同尺寸的容器。
  • 🔧?高度可控:通過 Props 和事件,你可以完全控制 PDF 的渲染行為,如頁碼、縮放、旋轉等。
  • ??Vue 3 兼容:完美支持 Vue 3 的組合式 API 和?<script setup>?語法。

🛠? 安裝

將?vue-pdf-embed?添加到你的項目中非常簡單:

npm install vue-pdf-embed

🚀 快速上手:三分鐘渲染你的第一個 PDF

集成?vue-pdf-embed?只需要幾行代碼。

1. 引入組件

<script setup>
import VuePdfEmbed from "vue-pdf-embed";
</script>

2. 在模板中使用

你需要提供一個?source?屬性,指向你的 PDF 文件。它可以是一個 URL、Base64 字符串或 ArrayBuffer。

<template><VuePdfEmbedsource="https://raw.githubusercontent.com/mozilla/pdf.js/master/web/compressed.tracemonkey-pldi-09.pdf"/>
</template>

就這樣!一個 PDF 查看器已經成功渲染在你的頁面上了。是不是超級簡單?


? 進階實戰:打造一個功能齊全的 PDF 查看器

當然,僅僅顯示 PDF 是不夠的。我們通常需要分頁、縮放等功能。下面,我們將創建一個更完整的 PDF 查看器組件。

核心思路

  1. 加載 PDF:監聽?@loaded?事件,在 PDF 加載完成后獲取總頁數。
  2. 分頁控制:創建“上一頁”和“下一頁”按鈕,通過修改?page?prop 來切換頁面。
  3. 縮放控制:創建“放大”和“縮小”按鈕,通過修改?scale?prop 來調整視圖大小。
  4. 狀態顯示:顯示當前頁碼和總頁數。

完整代碼示例 (PdfViewer.vue)

<template><div class="pdf-viewer-container"><!-- 控制欄 --><div class="controls"><button @click="prevPage" :disabled="page <= 1">上一頁</button><span>第 {{ page }} / {{ pageCount }} 頁</span><button @click="nextPage" :disabled="page >= pageCount">下一頁</button><button @click="zoomOut" :disabled="scale <= 0.5">縮小</button><span>縮放: {{ Math.round(scale * 100) }}%</span><button @click="zoomIn" :disabled="scale >= 2">放大</button></div><!-- PDF 渲染區域 --><div class="pdf-wrapper"><VuePdfEmbedref="pdfRef":source="pdfSource":page="page":scale="scale"@loaded="handleDocumentLoaded"@rendering-failed="handleRenderingFailed"/></div></div>
</template><script setup>
import { ref, watch } from "vue";
import VuePdfEmbed from "vue-pdf-embed";// PDF 文件源
const pdfSource = ref("https://raw.githubusercontent.com/mozilla/pdf.js/master/web/compressed.tracemonkey-pldi-09.pdf"
);// PDF 組件引用
const pdfRef = ref(null);// PDF 狀態
const page = ref(1);
const pageCount = ref(0);
const scale = ref(1);// PDF 加載完成回調
function handleDocumentLoaded(pdf) {console.log("PDF 加載完成!", pdf);pageCount.value = pdf.numPages;
}// PDF 渲染失敗回調
function handleRenderingFailed(error) {console.error("PDF 渲染失敗:", error);
}// 分頁功能
function prevPage() {if (page.value > 1) {page.value--;}
}function nextPage() {if (page.value < pageCount.value) {page.value++;}
}// 縮放功能
function zoomIn() {if (scale.value < 2) {scale.value += 0.25;}
}function zoomOut() {if (scale.value > 0.5) {scale.value -= 0.25;}
}// 監聽頁碼變化,確保在范圍內
watch(page, (newPage) => {if (newPage < 1) {page.value = 1;}if (newPage > pageCount.value && pageCount.value > 0) {page.value = pageCount.value;}
});
</script><style scoped>
.pdf-viewer-container {max-width: 900px;margin: 2rem auto;border: 1px solid #ccc;border-radius: 8px;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}.controls {display: flex;justify-content: center;align-items: center;gap: 1rem;padding: 1rem;background-color: #f5f5f5;border-bottom: 1px solid #ccc;border-radius: 8px 8px 0 0;
}.controls button {padding: 0.5rem 1rem;border: 1px solid #ddd;border-radius: 4px;background-color: #fff;cursor: pointer;
}.controls button:disabled {cursor: not-allowed;opacity: 0.5;
}.controls span {font-size: 0.9rem;min-width: 100px;text-align: center;
}.pdf-wrapper {height: 70vh;overflow: auto;background-color: #e9e9e9;padding: 1rem;
}/* vue-pdf-embed 的內部樣式,我們可以覆蓋它 */
:deep(.vue-pdf-embed > div) {margin-bottom: 8px;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}
</style>

常用 Props 和事件

  • Props:
  • source: PDF 文件來源 (URL, Base64, Uint8Array, …)。
  • page: (Number) 要顯示的頁碼。
  • scale: (Number) 縮放比例。
  • rotation: (Number) 旋轉角度 (0, 90, 180, 270)。
  • width: (Number | String) 容器寬度。
  • height: (Number | String) 容器高度。
  • Events:
  • @loaded: PDF 文檔加載完成時觸發,回調參數為 PDF.js 的文檔對象,可以從中獲取總頁數?numPages?等信息。
  • @rendered: 所有可見頁面渲染完成時觸發。
  • @rendering-failed: 渲染失敗時觸發。
  • @password-requested: 當 PDF 需要密碼時觸發。

總結

vue-pdf-embed?為在 Vue 應用中嵌入 PDF 提供了一個極其簡單而又強大的解決方案。它避免了?<iframe>?的笨重和同源策略問題,也比一些重量級 UI 庫更輕量、更靈活。

通過組合其 Props 和事件,你可以輕松構建出符合業務需求的、交互豐富的 PDF 查看器。如果你正在尋找一個可靠的 Vue PDF 渲染方案,vue-pdf-embed?絕對是你的不二之選。

?Vue 3 實戰:從零到一用 vue-pdf-embed 打造功能齊全的 PDF 查看器 - 高質量源碼分享平臺-免費下載各類網站源碼與模板及前沿技術分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96186.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

adb的常用命令

adb devices 用USB數據線連接電腦&#xff0c;查看連接上的設備 adb tcpip 5555 切換計算機的adb為wifi連接模式 adb connect 192.168.2.250:5555 連接手機的ip地址&#xff0c;如果連接成功&#xff0c;則可拔掉數據線 adb 查看adb的相關信息&#xff0c;包括版本號&#xff0…

穩態太陽光模擬器 | 多源分布式設計的要點有哪些?

穩態太陽模擬器的多源分布式設計&#xff0c;是一種通過多組獨立光源單元分布式排布、結合穩態光學調控技術&#xff0c;實現對太陽光譜、輻照強度及輻照均勻性精準復現的高端光模擬技術。其核心優勢在于突破傳統模擬光源在長期工作穩定性、大面積輻照均勻性及能量傳遞效率上的…

代碼隨想錄 day 35 動態規劃

第九章 動態規劃part03 正式開始背包問題&#xff0c;背包問題還是挺難的&#xff0c;雖然大家可能看了很多背包問題模板代碼&#xff0c;感覺挺簡單&#xff0c;但基本理解的都不夠深入。 如果是直接從來沒聽過背包問題&#xff0c;可以先看文字講解慢慢了解 這是干什么的。 …

大數據探索性分析——抽樣技術應用

2.3 概率抽樣 一、簡單隨機抽樣 # 數據預處理 LoanStats3c read.csv("D:/OneDrive - stu.fynu.edu.cn/大四上學期/ysq-大數據探索性分析/data/2數據集二&#xff1a;Loan Data--Lending Club/LoanStats3c/LoanStats3c.csv", header TRUE, fill TRUE, comment.char…

20 webUI應用中Controlnet精講(06)-結構理解與其它

前面的篇章已經詳細講解了線條約束、三維關系與空間深度、人體姿態等幾類controlnet的功能與應用&#xff0c;本節內容將對通過controlnet對圖像的結構理解及控圖效果。 序號 分類 Controlnet名稱 備注 1 線條約束 Canny&#xff08;硬邊緣&#xff09; 約束性強&#x…

【MFC】對話框屬性:Center(居中)

前言 本文介紹對話框屬性中的Center(居中)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&#xff1b; 此時…

SciKit-Learn 全面分析分類任務 breast_cancer 數據集

背景 乳腺癌數據集&#xff0c;569個樣本&#xff0c;30個特征&#xff0c;2個類別&#xff08;良性/惡性&#xff09; 步驟 加載數據集拆分訓練集、測試集數據預處理&#xff08;標準化&#xff09;選擇模型模型訓練&#xff08;擬合&#xff09;測試模型效果評估模型 分析方法…

【開題答辯全過程】以 _基于SpringBoot技術的“樹洞”心理咨詢服務平臺的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

R 語法高亮為什么沒有,是需要安裝專用的編輯軟件,R語言自帶的R-gui 功能還是比較簡單

R 語法高亮為什么沒有&#xff0c;是需要安裝專用的編輯軟件&#xff0c;R語言自帶的R-gui 功能還是比較簡單 以下是一些主流的 R 編輯軟件&#xff08;IDE / 編輯器&#xff09;&#xff0c;適用于不同需求的用戶&#xff1a; ? 最推薦&#xff1a;RStudio&#xff08;免費/…

使用UniApp實現下拉框和表格組件頁面

使用UniApp實現下拉框和表格組件頁面UniApp提供了一套完整的跨平臺開發框架&#xff0c;支持在多個平臺上運行。下拉框和表格是常見的UI組件&#xff0c;可以通過UniApp內置組件或第三方插件實現。下拉框組件的實現UniApp內置的<picker>組件可以實現下拉選擇功能。以下是…

JavaScript 對象說明

JavaScript 對象說明 1. 對象的基本概念 在 JavaScript 中&#xff0c;對象是一種復合數據類型&#xff0c;用于存儲相關聯的屬性和方法。對象可以看作是屬性的集合&#xff0c;其中每個屬性都由一個鍵&#xff08;key&#xff09;和一個值&#xff08;value&#xff09;組成。…

【競賽系列】機器學習實操項目04——客戶信用評估模型開發全流程(baseline)

上一章&#xff1a;機器學習實操項目03——Scikit-learn介紹及簡單分類案例 下一章&#xff1a; 機器學習核心知識點目錄&#xff1a;機器學習核心知識點目錄 機器學習實戰項目目錄&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大…

C++中的單例模式的實現

1 什么是單例模式單例模式 是一種創建型設計模式&#xff0c;確保一個類在整個程序生命周期中只有一個實例&#xff0c;并提供一個全局訪問點。核心要求&#xff1a;類不能被外部隨意創建&#xff08;禁止 public 構造函數或限制實例數量&#xff09;。不能被復制或移動。提供一…

匯編基礎1

1.格式偽操作&#xff1a;它們不是ARM處理器實際的指令&#xff08;如MOV&#xff0c; ADD等&#xff09;&#xff0c;而是寫給匯編器看的命令&#xff0c;用于指導匯編器如何工作area reset, code, readonlycode32entry內容 endarea: 這是最重要的一個偽操作&#xff0c;用…

設計模式(C++)詳解—單例模式(2)

<摘要> 單例模式是創建型設計模式中最簡單但應用最廣泛的模式之一&#xff0c;它確保一個類只有一個實例并提供全局訪問點。本文從歷史背景和核心概念出發&#xff0c;系統闡述了單例模式的產生緣由和演進脈絡&#xff0c;深入剖析了其在資源管理、狀態一致性和訪問控制方…

kafka如何保證消息的順序性

kafka如何保證消息的順序性 Kafka只能在分區&#xff08;Partition&#xff09;級別保證消息的順序性&#xff0c;而不能在主題&#xff08;Topic&#xff09;級別保證全局順序。 核心原理&#xff1a;分區和偏移量分區&#xff08;Partition&#xff09;是順序性的基礎&#x…

傳輸層:UDP/TCP協議

網絡協議圖 一.UDP 特點: 無連接&#xff0c;不可靠&#xff0c;面向數據報&#xff0c;全雙工&#xff08;前面網絡編程中介紹過&#xff09; 格式: 服務器的端口號一般都是程序員指定的(這樣你才能訪問到),客戶端的端口號是系統自動分配的(如果提前指定好, 可能會與其他程…

A/B測試全解析:原理、流程與實戰案例

A/B測試&#xff08;AB Testing&#xff09;原理與實踐全解析 在數據驅動的時代&#xff0c;A/B測試幾乎是每一個互聯網公司都會使用的實驗方法。無論是電商平臺優化轉化率&#xff0c;還是內容平臺提升點擊率&#xff0c;抑或是游戲公司提升留存&#xff0c;A/B測試都是最常見…

循環神經網絡(三):小練習

RNN小練習 要求&#xff1a; 假設有 4 個字 吃 了 沒 &#xff1f;&#xff0c;請使用 torch.nn.RNN 完成以下任務 將每個進行 one-hot 編碼請使用 吃 了 沒 作為輸入序列&#xff0c;了 沒 &#xff1f; 作為輸出序列RNN 的 hidden_size 64請將 RNN 的輸出使用全連接轉換成 4…

ESPIDF官方文檔,啟用dhcp會禁用對應的STA或AP的靜態IP,我測試STA確實是,但是AP不是,為什么

1. STA 模式下的 DHCP&#xff08;客戶端角色&#xff09;ESP32 當 Station&#xff08;STA&#xff09; 時&#xff0c;它的行為就跟你的手機/筆記本連 Wi-Fi 一樣&#xff1a;DHCP 客戶端 → 去路由器&#xff08;DHCP 服務器&#xff09;要一個 IP。特點啟用 DHCP&#xff0…