前端實現文件預覽功能

前端實現文件預覽功能

?

需求:實現一個在線預覽pdf、excel、word、圖片等文件的功能。
介紹:支持pdf、xlsx、docx、jpg、png、jpeg。
以下使用Vue3代碼實現所有功能,建議以下的預覽文件標簽可以在外層包裹一層彈窗。

?

圖片預覽

iframe標簽能夠將另一個HTML頁面嵌入到當前頁面中,我們的圖片也能夠使用iframe標簽來進行展示。

<iframe??:src="圖片地址"style="z-index:?1000;?height:650px;?width:?100%;?margin:?0?auto"sandbox="allow-scripts?allow-top-navigation?allow-same-origin?allow-popups"
>

「sandbox」這個屬性如果是單純預覽圖片可以不使用,該屬性對呈現在 iframe 框架中的內容啟用一些額外的限制條件。屬性值可以為空字符串(這種情況下會啟用所有限制),也可以是用空格分隔的一系列指定的字符串。

  • allow-scripts: 允許嵌入的瀏覽上下文運行腳本(但不能創建彈窗)。如果沒有使用該關鍵字,就無法運行腳本。

  • allow-top-navigation: 允許將框架內所加載頁面中的超鏈接導航到父級窗口

  • allow-same-popups: 允許彈窗 (例如 window.open, target="_blank")。如果沒有使用該關鍵字,相應的功能將自動被禁用。

  • allow-same-origin: 如果沒有使用該關鍵字,嵌入的瀏覽上下文將被視為來自一個獨立的源,這將使 same-origin policy 同源檢查失敗。使用了這個屬性,那么當前頁面和iframe打開的頁面視為同源。

word文檔預覽(docx)

先下載npm包
npm?i?docx-preview?--save
<div?class="docxRef"></div><script>
import?{?renderAsync?}?from?'docx-preview';function?fn()?{
//?這里的res.data是?blob文件流,如果自己的不是blob文件流
//?可以通過URL.createObjectURL(參數)?參數為File格式,轉換為blob文件流let?blob?=?res.datalet?childRef?=?document.getElementsByClassName('docxRef');renderAsync(blob,?childRef[0])?//渲染
}
fn()</script>

「blob文件流」

圖片

預覽excel文件(xlsx)

下載包
npm?install?xlsx@0.16.0
<div?class="xlsxClass"></div>
const?reader?=?new?FileReader();
//通過readAsArrayBuffer將blob轉換為ArrayBuffer對
reader.readAsArrayBuffer(res.data)?//?這里的res.data是blob文件流
reader.onload?=?(event)?=>?{//?讀取ArrayBuffer數據變成Uint8Arrayvar?data?=?new?Uint8Array(event.target.result);//?這里的data里面的類型和后面的type類型要對應var?workbook?=?XLSX.read(data,?{?type:?"array"?});var?sheetNames?=?workbook.SheetNames;?//?工作表名稱var?worksheet?=?workbook.Sheets[sheetNames[0]];//?var?excelData?=?XLSX.utils.sheet_to_json(worksheet);?//JSONlet?html?=?XLSX.utils.sheet_to_html(worksheet);document.getElementsByClassName('xlsxClass')[0].innerHTML?=?html
};

pdf預覽

下載包?npm?install?pdfjs-dist
本例使用的是npm?install?pdfjs-dist@2.0.943版本,以下例子使用的是vue3+vite創建的項目
以下例子通過canvas來渲染pdf
<template><div?class="box"><div?class="tool-bar"><div>{{?pdfParams.pageNumber?}}?/?{{?pdfParams.total?}}</div><button?type="primary"?:disabled="pdfParams.pageNumber?==?pdfParams.total"?@click="nextPage">下一頁</button><button?type="primary"?:disabled="pdfParams.pageNumber?==?1"?@click="prevPage">上一頁</button></div><canvas?id="pdf-render"></canvas></div>
</template>
<script?setup>
import?{?onMounted,?ref,?reactive?}?from?'vue'
const?pdfParams?=?reactive({pageNumber:?1,?//?當前頁total:?0,?//?總頁數
});//?不要定義為ref或reactive格式,就定義為普通的變量
let?pdfDoc?=?null;
//?這里必須使用異步去引用pdf文件,直接去import會報錯,也不知道為什么
onMounted(async?()=>?{let?pdfjs?=?await?import('pdfjs-dist/build/pdf')let?pdfjsWorker?=?await?import('pdfjs-dist/build/pdf.worker.entry')pdfjs.GlobalWorkerOptions.workerSrc?=?pdfjsWorker//?此文件位于public/test2.pdflet?url?=?ref('/test2.pdf')pdfjs.getDocument(url.value).promise.then(doc?=>?{pdfDoc?=?docpdfParams.total?=?doc.numPagesgetPdfPage(1)})
})//?加載pdf的某一頁
const?getPdfPage?=?(number)?=>?{pdfDoc.getPage(number).then(page?=>?{const?viewport?=?page.getViewport()const?canvas?=?document.getElementById('pdf-render')const?context?=?canvas.getContext('2d')canvas.width?=?viewport.viewBox[2]canvas.height?=?viewport.viewBox[3]viewport.width?=?viewport.viewBox[2]viewport.height?=?viewport.viewBox[3]canvas.style.width?=?Math.floor(viewport.width)?+?'px'canvas.style.height?=?Math.floor(viewport.height)?+?'px'let?renderContext?=?{canvasContext:?context,viewport:?viewport,//?這里transform的六個參數,使用的是transform中的Matrix(矩陣)transform:?[1,?0,?0,?-1,?0,?viewport.height]}//?進行渲染page.render(renderContext)})
}
//?下一頁功能
const?prevPage?=?()?=>?{if(pdfParams.pageNumber?>?1)?{pdfParams.pageNumber?-=?1}?else?{pdfParams.pageNumber??=?1}getPdfPage(pdfParams.pageNumber)
}
//?上一頁功能
const?nextPage?=?()?=>?{if(pdfParams.pageNumber?<?pdfParams.total)?{pdfParams.pageNumber?+=?1}?else?{pdfParams.pageNumber?=?pdfParams.total}getPdfPage(pdfParams.pageNumber)
}
</script>

以上pdf代碼引用文章:(54條消息) 前端pdf預覽、pdfjs的使用_pdf.js_無知的小菜雞的博客-CSDN博客
pdfjs官方代碼:例子 (mozilla.github.io)
以上代碼看不懂的地方可以查閱官方代碼,大部分都是固定的寫法。

?

「以上注意點:」

  • 必須異步引用pdf的文件!!!

  • pdf演示文件位于public/test2.pdf

  • transform: [1, 0, 0, -1, 0, viewport.height],使用了transform中的Matrix(矩陣)

  • 下一頁和上一頁功能都需要重新渲染

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

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

相關文章

前端雜項-個人總結八股文的背誦方案

個人總結八股文的背誦方案 URL到顯示網頁的過程 瀏覽器解析URL&#xff0c;獲取協議&#xff0c;主機名&#xff0c;端口號&#xff0c;路徑等信息&#xff0c;并通過DNS查詢將主機名轉換為對應的IP地址瀏覽器與服務器建立TCP&#xff0c;進行三次握手。瀏覽器向服務器發送HT…

枚舉緩存工具

此文章為筆記&#xff0c;為閱讀其他文章的感受、補充、記錄、練習、匯總&#xff0c;非原創&#xff0c;感謝每個知識分享者。 文章目錄 1. 背景2. 枚舉緩存3. 樣例展示4. 性能對比5. 總結 本文通過幾種樣例展示如何高效優雅的使用java枚舉消除冗余代碼。 1. 背景 枚舉在系統…

不需要用@Param注解與需要用@Param注解的情況

不需要用Param注解&#xff1a; 1.只有一個參數時&#xff0c;不需要用Param注解。此時在不使用Parma注解的情況下&#xff0c;sql語句中的參數占位符名稱直接使用任何名稱均可&#xff1b; 2.方法參數是引用數據類型的情況下&#xff0c;不需要用Param注解。 需要用Param注…

QT生成Word PDF文檔

需求&#xff1a;將軟件處理的結果保存為一個報告文檔&#xff0c;文檔中包含表格、圖片、文字&#xff0c;格式為word的.doc和.pdf。生成word是為了便于用戶編輯。 開發環境&#xff1a;qt4.8.4vs2010 在qt的官網上對于pdf的操作介紹如下&#xff1a;http://qt-project.org/…

華為認證 | H3C廠商證書,含金量有多高?

華為H3C認證是中國第一家建立國際規范的完整的網絡技術認證體系&#xff0c;它的作用是不言而喻的&#xff0c;工作上它能給你帶來技能加分。 那么H3C認證網絡工程師證書含金量怎么樣呢&#xff1f;下面我們就來了解一下吧。 01 H3C認證網絡工程師證書含金量 全面覆蓋H3C相關…

微服務Eureka注冊中心

目錄 一、Eureka的結構和作用 二、搭建eureka-server 三、服務注冊 四、服務發現 假如我們的服務提供者user-service部署了多個實例&#xff0c;如圖&#xff1a; 存在的問題&#xff1a; order-service在發起遠程調用的時候&#xff0c;該如何得知user-service實例的ip地址…

深度學習快速入門系列---損失函數

在深度學習中&#xff0c;損失函數的作用是量化預測值和真實值之間的差異&#xff0c;使得網絡模型可以朝著真實值的方向預測&#xff0c;損失函數通過衡量模型預測結果與真實標簽之間的差異&#xff0c;反映模型的性能。同時損失函數作為一個可優化的目標函數&#xff0c;通過…

10個微服務設計模式

微服務設計模式是一種指導微服務架構設計和開發的一系列原則和實踐。微服務設計模式的目的是為了解決微服務架構中遇到的一些常見的問題和挑戰&#xff0c;比如服務劃分、服務通信、服務治理、服務測試等。微服務設計模式可以幫助我們構建出高效、可靠、可擴展、可維護的微服務…

九耶丨閣瑞鈦倫特-井字棋html5代碼

你想了解關于井字棋&#xff08;Tic-Tac-Toe&#xff09;的HTML代碼嗎&#xff1f;以下是一個簡單的井子棋的HTML代碼示例&#xff1a; <!DOCTYPE html> <html> <head><title>Tic-Tac-Toe</title><style>.board {display: flex;flex-wrap…

使用AT命令操作Modem 3G/4G模塊

1. 引言 AT命令是一種通信協議&#xff0c;用于控制和配置各種設備&#xff0c;尤其在通信領域中具有重要性。它的名稱來源于"ATtention"&#xff08;注意&#xff09;&#xff0c;因為命令通常以"AT"開頭。AT命令最早被用于調制解調器&#xff0c;用于與…

redis學習筆記(三)

文章目錄 key操作&#xff08;1&#xff09;查找鍵&#xff08;2&#xff09;判斷鍵是否存在&#xff08;3&#xff09;查看鍵的的值的數據類型&#xff08;4&#xff09;刪除鍵以及鍵對應的值&#xff08;5&#xff09;查看鍵的有效期&#xff08;6&#xff09;設置key的有效期…

springboot整合rabbitmq

rabbitmq的七種模式 Hello word 客戶端引入依賴 <!--rabbitmq 依賴客戶端--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency> 生產者 imp…

STM32 LoRa源碼解讀

目錄結構&#xff1a; SX1278 |-- include | |-- fifo.h | |-- lora.h | |-- platform.h | |-- radio.h | |-- spi.h | |-- sx1276.h | |-- sx1276Fsk.h | |-- sx1276FskMisc.h | |-- sx1276Hal.h | |-- sx1276LoRa.h | -- sx1276LoRaMisc.h – src |-- fifo.c |-- lora.c |-- …

【解析postman工具的使用---基礎篇】

postman前端請求詳解 主界面1.常見類型的接口請求1.1 查詢參數的接口請求1.1.1 什么是查詢參數?1.1.2 postman如何請求 1.2 ?表單類型的接口請求1.2.1 復習下http請求1.2.2? 什么是表單 1.3 上傳文件的表單請求1.4? json類型的接口請求 2. 響應接口數據分析2.1 postman的響…

紅帽RHCA考試內容解析

紅帽RHCA考試內容解析&#xff1a;最新的RHCA有3大方向體系&#xff0c;考試內容分別為&#xff1a; 一、Platform 平臺技術 RH442&#xff1a;性能調優 使用紅帽企業Linux和紅帽網絡提供的工具來學習Linux的性能調優和規劃的技巧及方法&#xff0c;學習系統架構&#xff0c;…

什么是DNS欺騙及如何進行DNS欺騙

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、什么是 DNS 欺騙&#xff1f;二、開始1.配置2.Ettercap啟動3.操作 總結 前言 我已經離開了一段時間&#xff0c;我現在回來了&#xff0c;我終于在做一個教…

【AI】p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路

p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路 p54導航網格p55藍圖實現AI隨機移動和跟隨移動AI Move To&#xff08;AI進行移動&#xff09;Get Random Pointln Navigable Radius&#xff08;獲取可導航半徑內的隨機點&#xff09…

Java基礎十 - 設計模式

一、單例 1. 創建 餓漢式 package basic;public class ESingleton {// 先私有化靜態實例private static ESingleton eSingleton new ESingleton();// 私有化構造方法&#xff0c;防止外部實例化private ESingleton(){};// 提供全局訪問方法public static ESingleton geteSi…

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 Matlab實現LSTM長短期記憶神經…

識別和應對內存抖動

關于作者&#xff1a;CSDN內容合伙人、技術專家&#xff0c; 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 &#xff0c;擅長java后端、移動開發、人工智能等&#xff0c;希望大家多多支持。 目錄 一、導讀二、概覽三、案例分析3.1 使用memory-profiler3.2 使用 cp…