端功能問題系列文章,點(diǎn)擊上方合集↑
序言
大家好,我是大澈!
本文約2100+字,整篇閱讀大約需要3分鐘。
本文主要內(nèi)容分三部分,如果您只需要解決問題,請閱讀第一、二部分即可。如果您有更多時(shí)間,進(jìn)一步學(xué)習(xí)問題相關(guān)知識點(diǎn),請閱讀至第三部分。
感謝關(guān)注微信公眾號:“程序員大澈”,然后加入問答群,從此讓解決問題的你不再孤單!
方式一、pdf文件理論上可以在瀏覽器直接打開預(yù)覽但是需要打開新頁面。在僅僅是預(yù)覽pdf文件且UI要求不高的情況下可以直接通過a標(biāo)簽href屬性實(shí)現(xiàn)預(yù)覽
<a href="文檔地址"></a>
方式二、通過jquery插件jquery.media.js實(shí)現(xiàn) 這個(gè)插件可以實(shí)現(xiàn)pdf預(yù)覽功能(包括其他各種媒體文件)但是對word等類型的文件無能為力。 實(shí)現(xiàn)方式: js代碼:
<script type="text/javascript" src="jquery-1.7.1.min.js"></script> <script type="text/javascript" src="jquery.media.js"></script> 復(fù)制代碼
html結(jié)構(gòu):
<body> <div id="handout_wrap_inner"></div> </body> 復(fù)制代碼
調(diào)用方式:
<script type="text/javascript"> $('#handout_wrap_inner').media({ width: '100%', height: '100%', autoplay: true, src:'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf', }); </script> 復(fù)制代碼
方式三、直接通過頁面內(nèi)嵌iframe
$("<iframe src='"+ this.previewUrl +"' width='100%' height='362px' frameborder='1'>").appendTo($(".video-handouts-preview")); 復(fù)制代碼
此外還可以在iframe標(biāo)簽之間提供一個(gè)提示類似這樣
<iframe :src="previewUrl" width="100%" height="100%"> This browser does not support PDFs. Please download the PDF to view it: <a :href="previewUrl">Download PDF</a> </iframe> 復(fù)制代碼
方式四、通過標(biāo)簽嵌入內(nèi)容
<embed :src="previewUrl" type="application/pdf" width="100%" height="100%">
此標(biāo)簽h5特性中包含四個(gè)屬性:高、寬、類型、預(yù)覽文件src! 與< iframe > < / iframe > 不同,這個(gè)標(biāo)簽是自閉合的的,也就是說如果瀏覽器不支持PDF的嵌入,那么這個(gè)標(biāo)簽的內(nèi)容什么都看不到!
方式五、標(biāo)簽和iframe使用差別較小
<object :src="previewUrl" width="100%" height="100%"> This browser does not support PDFs. Please download the PDF to view it: <a :href="previewUrl">Download PDF</a> </object> 復(fù)制代碼
除方式二以外其他都是直接通過標(biāo)簽將內(nèi)容引入頁面實(shí)現(xiàn)預(yù)覽
方式六、PDFObject
PDFObject實(shí)際上也是通過標(biāo)簽實(shí)現(xiàn)的直接上代碼
<!DOCTYPE html> <html> <head> <title>Show PDF</title> <meta charset="utf-8" /> <script type="text/javascript" src='pdfobject.min.js'></script> <style type="text/css"> html,body,#pdf_viewer{ width: 100%; height: 100%; margin: 0; padding: 0; } </style> </head> <body> <div id="pdf_viewer"></div> </body> <script type="text/javascript"> if(PDFObject.supportsPDFs){ // PDF嵌入到網(wǎng)頁 PDFObject.embed("index.pdf", "#pdf_viewer" ); } else { location.href = "/canvas"; } </script> </html>
還可以通過以下代碼進(jìn)行判斷是否支持PDFObject預(yù)覽
if(PDFObject.supportsPDFs){ console.log("Yay, this browser supports inline PDFs."); } else { console.log("Boo, inline PDFs are not supported by this browser"); } 復(fù)制代碼
方式七、PDF.js
PDF.js可以實(shí)現(xiàn)在html下直接瀏覽pdf文檔,是一款開源的pdf文檔讀取解析插件,非常強(qiáng)大,能將PDF文件渲染成Canvas。PDF.js主要包含兩個(gè)庫文件,一個(gè)pdf.js和一個(gè)pdf.worker.js,一個(gè)負(fù)責(zé)API解析,一個(gè)負(fù)責(zé)核心解析。
word、ppt、xls文件實(shí)現(xiàn)在線預(yù)覽的方式比較簡單可以直接通過調(diào)用微軟的在線預(yù)覽功能實(shí)現(xiàn) (預(yù)覽前提:資源必須是公共可訪問的)
<iframe src='https://view.officeapps.live.com/op/view.aspx?src=http://storage.xuetangx.com/public_assets/xuetangx/PDF/1.xls' width='100%' height='100%' frameborder='1'> </iframe> 復(fù)制代碼
src就是要實(shí)現(xiàn)預(yù)覽的文件地址 具體文檔看這微軟接口文檔
補(bǔ)充:google的文檔在線預(yù)覽實(shí)現(xiàn)同微軟(資源必須是公共可訪問的)
<iframe :src="'https://docs.google.com/viewer?url="fileurl"></iframe> 復(fù)制代碼
3、word文件
XDOC可以實(shí)現(xiàn)預(yù)覽以DataURI表示的DOC文檔,此外XDOC還可以實(shí)現(xiàn)文本、帶參數(shù)文本、html文本、json文本、公文等在線預(yù)覽,具體實(shí)現(xiàn)方法請看官方文檔
下面這種方式可以實(shí)現(xiàn)快速預(yù)覽word但是對文件使用的編輯器可能會有一些限制
<a target="_blank" rel="nofollow">XDOC</a> 復(fù)制代碼
4、excel文件
目前excel文件已經(jīng)有了類似pdf.js那樣的解析sheet.js
總結(jié):
1、免費(fèi)純前端方式實(shí)現(xiàn)在線預(yù)覽word、excel、ppt最優(yōu)選擇微軟在線預(yù)覽(不可編輯)
2、利用后端將文件轉(zhuǎn)為圖片,前端以圖片形式預(yù)覽(可行方案)
3、購買在線預(yù)覽服務(wù)例如百度DOC文檔服務(wù)、永中、I DOC VIEW等
著名:文章內(nèi)容是從網(wǎng)上搜集資料所得;在次發(fā)表只為自己以及頭條程序員兄弟日后使用圖個(gè)方便。
覺得有用記得收藏轉(zhuǎn)發(fā)!
?
需求:實(shí)現(xiàn)一個(gè)在線預(yù)覽pdf、excel、word、圖片等文件的功能。
介紹:支持pdf、xlsx、docx、jpg、png、jpeg。
以下使用Vue3代碼實(shí)現(xiàn)所有功能,建議以下的預(yù)覽文件標(biāo)簽可以在外層包裹一層彈窗。?
iframe標(biāo)簽?zāi)軌驅(qū)⒘硪粋€(gè)HTML頁面嵌入到當(dāng)前頁面中,我們的圖片也能夠使用iframe標(biāo)簽來進(jìn)行展示。
<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」這個(gè)屬性如果是單純預(yù)覽圖片可以不使用,該屬性對呈現(xiàn)在 iframe 框架中的內(nèi)容啟用一些額外的限制條件。屬性值可以為空字符串(這種情況下會啟用所有限制),也可以是用空格分隔的一系列指定的字符串。
先下載npm包
npm i docx-preview --save
<div class="docxRef"></div>
<script>
import { renderAsync } from 'docx-preview';
function fn() {
// 這里的res.data是 blob文件流,如果自己的不是blob文件流
// 可以通過URL.createObjectURL(參數(shù)) 參數(shù)為File格式,轉(zhuǎn)換為blob文件流
let blob = res.data
let childRef = document.getElementsByClassName('docxRef');
renderAsync(blob, childRef[0]) //渲染
}
fn()
</script>
「blob文件流」
下載包
npm install xlsx@0.16.0
<div class="xlsxClass"></div>
const reader = new FileReader();
//通過readAsArrayBuffer將blob轉(zhuǎn)換為ArrayBuffer對
reader.readAsArrayBuffer(res.data) // 這里的res.data是blob文件流
reader.onload = (event) => {
// 讀取ArrayBuffer數(shù)據(jù)變成Uint8Array
var data = new Uint8Array(event.target.result);
// 這里的data里面的類型和后面的type類型要對應(yīng)
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); //JSON
let html = XLSX.utils.sheet_to_html(worksheet);
document.getElementsByClassName('xlsxClass')[0].innerHTML = html
};
下載包 npm install pdfjs-dist
我使用的是npm install pdfjs-dist@2.0.943版本,以下例子使用的是vue3+vite創(chuàng)建的項(xiàng)目
以下例子通過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, // 當(dāng)前頁
total: 0, // 總頁數(shù)
});
// 不要定義為ref或reactive格式,就定義為普通的變量
let pdfDoc = null;
// 這里必須使用異步去引用pdf文件,直接去import會報(bào)錯(cuò),也不知道為什么
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.pdf
let url = ref('/test2.pdf')
pdfjs.getDocument(url.value).promise.then(doc => {
pdfDoc = doc
pdfParams.total = doc.numPages
getPdfPage(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的六個(gè)參數(shù),使用的是transform中的Matrix(矩陣)
transform: [1, 0, 0, -1, 0, viewport.height]
}
// 進(jìn)行渲染
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預(yù)覽、pdfjs的使用_pdf.js_無知的小菜雞的博客-CSDN博客
pdfjs官方代碼:例子 (mozilla.github.io)
以上代碼看不懂的地方可以查閱官方代碼,大部分都是固定的寫法。
「以上注意點(diǎn):」
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。