Vue實現(xiàn)docx、pdf格式文件在線預覽功能
介紹
在業(yè)務(wù)中,如果遇到文檔管理類的功能,會出現(xiàn)需要在線預覽的業(yè)務(wù)需求,本文主要是通過第三方庫來實現(xiàn)文檔預覽功能,并將其封裝成preview組件
docx
docx的實現(xiàn)需要使用docx-preview插件
安裝
npm i docx-preview
使用
創(chuàng)建一個容器標簽
<div ref="file" v-show="extend == 'docx'"></div>
引入并創(chuàng)建渲染函數(shù)
import { renderAsync } from "docx-preview";
renderDocx() {
renderAsync(this.fileData, this.$refs.file, null, {
className: "docx", //默認和文檔樣式類的類名/前綴
inWrapper: true, //啟用圍繞文檔內(nèi)容呈現(xiàn)包裝器
ignoreWidth: false, //禁用頁面的渲染寬度
ignoreHeight: false, //禁用頁面的渲染高度
ignoreFonts: false, //禁用字體渲染
breakPages: true, //在分頁符上啟用分頁
ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分頁
experimental: false, //啟用實驗功能(制表符停止計算)
trimXmlDeclaration: true, //如果為true,則在解析之前將從xml文檔中刪除xml聲明
useBase64URL: false, //如果為true,圖像、字體等將轉(zhuǎn)換為base 64 URL,否則使用URL.createObjectURL
useMathMLPolyfill: false, //包括用于鉻、邊等的MathML多填充。
showChanges: false, //啟用文檔更改的實驗渲染(插入/刪除)
debug: false, //啟用額外的日志記錄
});
},pdf的預覽需要使用PDFJS這個插件,通過將文件流解析寫到canvas上實現(xiàn)預覽效果
安裝
npm i pdfjs-dist
引入和使用
<canvas v-for="num in numPages" :key="num" :id="'canvas_' + num" class="canvas" ></canvas>
此處pdf的渲染數(shù)據(jù)this.fileData必須是一個ArrayBuffer格式的數(shù)據(jù),如果請求的的數(shù)據(jù)是Blob格式必須要先使用Blob.arrayBuffer()轉(zhuǎn)換
async renderPdf(num = 1) {
this.fileData.getPage(num).then(page => {
// 設(shè)置canvas相關(guān)的屬性
const canvas = document.getElementById("canvas_" + num);
const ctx = canvas.getContext("2d");
const dpr = window.devicePixelRatio || 1;
const bsr =
ctx.webkitBackingStorePixelRatio ||
ctx.mozBackingStorePixelRatio ||
ctx.msBackingStorePixelRatio ||
ctx.oBackingStorePixelRatio ||
ctx.backingStorePixelRatio ||
1;
const ratio = dpr / bsr;
const viewport = page.getViewport({ scale: this.pdfScale }); // 設(shè)置放縮比率
canvas.width = viewport.width * ratio;
canvas.height = viewport.height * ratio;
canvas.style.width = viewport.width + "px";
canvas.style.height = viewport.height + "px";
ctx.setTransform(ratio, 0, 0, ratio, 0, 0);
const renderContext = {
canvasContext: ctx,
viewport: viewport,
};
// 數(shù)據(jù)渲染到canvas畫布上
page.render(renderContext);
if (this.numPages > num) {
setTimeout(() => {
return this.renderPdf(num + 1);
});
}
});
},pdf的放大和縮小
pdf文件渲染后如果不能調(diào)整大小會因為源文件的大小和文件內(nèi)容,出現(xiàn)模糊的問題,所以進行縮放渲染是有必要的
// pdf放大
setPdfZoomin() {
const max = 2;
if (this.pdfScale >= max) {
return;
}
this.pdfScale = this.pdfScale + 0.2;
this.renderPdf();
},
// pdf縮小
setPdfZoomout() {
const min = 0.6;
if (this.pdfScale <= min) {
return;
}
this.pdfScale = this.pdfScale - 0.1;
this.renderPdf();
},多格式的文件渲染函數(shù)映射
因為將多種文件渲染放在一個文件中,所以處理函數(shù)需要做映射處理,執(zhí)行對應(yīng)格式的文件渲染
renderPreview(extend) {
const handle = {
docx: () => {
this.extend = "docx";
this.$nextTick(() => this.renderDocx());
},
pdf: () => {
this.extend = "pdf";
new Blob([this.fileData]).arrayBuffer().then(res => {
PDFJS.getDocument(res).promise.then(pdfDoc => {
this.numPages = pdfDoc.numPages; // pdf的總頁數(shù)
this.fileData = pdfDoc;
this.$nextTick(() => this.renderPdf());
});
});
},
};
this.isLoading = false;
if (!Object.hasOwn(handle, extend)) {
this.extendName = extend;
return (this.extend = "other");
}
handle[extend]();
},不支持的文件提示處理
在這個文件中,目前只支持docx和pdf的預覽,如果出現(xiàn)了不支持的文件,需要增加一個提示處理,告知用戶 例如如下的文件提示
<div class="container" v-show="extend == 'other'">
<a-alert
:message="`不支持.${this.extendName}格式的在線預覽,請下載后預覽或轉(zhuǎn)換為支持的格式`"
description="支持docx, pdf格式的在線預覽"
type="info"
show-icon
/>
</div>總結(jié)
本文只是簡單的總結(jié)了關(guān)于文件預覽的純前端實現(xiàn)和封裝方式,對于業(yè)務(wù)的思路簡單整理,如果是對于有更復雜的場景,還需要有更加具體的拆分和優(yōu)化。
到此這篇關(guān)于Vue實現(xiàn)docx、pdf格式文件在線預覽功能的文章就介紹到這了,更多相關(guān)Vue文件在線預覽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用vue + koa2 + mockjs模擬數(shù)據(jù)的方法教程
這篇文章主要給大家介紹了關(guān)于利用vue + koa2 + mockjs模擬數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-11-11
Vue與.net?Core?接收List<T>泛型參數(shù)
這篇文章主要介紹了Vue與.net?Core?接收List<T>泛型參數(shù),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-04-04
vue中內(nèi)嵌iframe的src更新頁面未刷新問題及解決
這篇文章主要介紹了vue中內(nèi)嵌iframe的src更新頁面未刷新問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
vue用h()函數(shù)創(chuàng)建Vnodes的實現(xiàn)
Vue提供了一個h()函數(shù)用于創(chuàng)建vnodes,本文就來介紹一下vue用h()函數(shù)創(chuàng)建Vnodes的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01
vue3如何通過動態(tài)綁定exclude在退出登錄時清除keepAlive緩存
這篇文章主要介紹了vue3如何通過動態(tài)綁定exclude在退出登錄時清除keepAlive緩存問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04

