Vue使用pdf.js和docx-preview實(shí)現(xiàn)docx和pdf的在線預(yù)覽
后端代碼:
SshConfig sshConfig = new SshConfig("ip", port, "username", "password");
ChannelSftp channelSftp = sshConfig.getChannelSftp();
String downUrl = "/**/**/";//服務(wù)器相對(duì)路徑
String pathname1 = downUrl + fileId + ".docx";
String pathname2 = downUrl + fileId + ".pdf";
InputStream inputStream1 = null;
InputStream inputStream2 = null;
//文件可能是docx或者pdf,因此需要分別嘗試獲取文件輸入流
try {
inputStream1 = channelSftp.get(pathname1);
} catch (SftpException e) {
inputStream2 = channelSftp.get(pathname2);
}
byte[] buffer = new byte[1024];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
if (inputStream1 != null) {
while ((bytesRead = inputStream1.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
byte[] fileBytes1 = output.toByteArray();
// 現(xiàn)在fileBytes中包含了遠(yuǎn)程文件的字節(jié)流
if (fileBytes1 != null) {
channelSftp.disconnect();
sshConfig.disconnect();
// Convert the file to base64
String base64 = Base64.getEncoder().encodeToString(fileBytes1);
map.put("fileUrl", pathname1);
map.put("base64", base64);
return map;
}
} else {
while ((bytesRead = inputStream2.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
byte[] fileBytes1 = output.toByteArray();
// 現(xiàn)在fileBytes中包含了遠(yuǎn)程文件的字節(jié)流
if (fileBytes1 != null) {
channelSftp.disconnect();
sshConfig.disconnect();
// Convert the file to base64
String base64 = Base64.getEncoder().encodeToString(fileBytes1);
map.put("fileUrl", pathname2);
map.put("base64", base64);
return map;
}
}
return map;前端代碼:
mounted方法中判斷使用哪一個(gè)插件
mounted() {
let fileUrl = sessionStorage.getItem("fileUrl");
if (fileUrl.indexOf('.docx') !== -1) {
let bstr = sessionStorage.getItem("bstr");
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
console.log("docx");
//u8arr.buffer 轉(zhuǎn)成arrayBuffer類型
this.docxRender(u8arr.buffer, this.title);
} else {
let bstr = sessionStorage.getItem("bstr");
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
this.pdfData = u8arr;
console.log("pdf");
this.pdfReader(u8arr);
}
},docx文件的渲染
//渲染docx
docxRender(buffer, fileName) {
let box = document.createElement('div') // 創(chuàng)建一個(gè)div
let docx = require("docx-preview")
docx.renderAsync(buffer, box).then(() => { // 渲染文件
let zhengwen = document.getElementById('zhengwen');
zhengwen.appendChild(box);
//document.write(box.outerHTML);
//渲染文件后將div添加到新窗口中,div不能提前添加,否則新窗口中不能渲染出文件
//注意這里不能直接用box
document.title = fileName // 窗口標(biāo)題
document.getElementsByClassName('docx')[0].style.width = 'auto'
// 如果文件顯示正常,不用設(shè)置寬度
}).catch(function () {
Message({
type: "error",
message: "該文檔可能已損壞,請(qǐng)嘗試下載查閱"
})
})
},渲染效果圖:

pfd文件渲染:
//渲染pdf
pdfReader(u8arr) {
// 獲取PDF容器元素
let container = this.$refs.pdfContainer;
// 配置PDFJS worker路徑
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.worker.min.js';
// 加載PDF文件流
pdfjsLib.getDocument(u8arr).promise.then((pdf) => {
// 獲取頁(yè)面數(shù)量
const numPages = pdf.numPages;
// 循環(huán)遍歷所有頁(yè)面
for (let i = 1; i <= numPages; i++) {
pdf.getPage(i).then((page) => {
// 設(shè)置縮放比例
const scale = 1.7;
// 獲取渲染上下文
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// 計(jì)算畫(huà)布大小
const viewport = page.getViewport({scale});
canvas.height = viewport.height;
canvas.width = viewport.width;
// 將PDF頁(yè)面渲染到畫(huà)布上
const renderContext = {
canvasContext: ctx,
viewport: viewport
};
page.render(renderContext);
// 添加畫(huà)布到容器中
container.appendChild(canvas);
});
}
}).catch(function () {
Message({
type: "error",
message: "該文檔可能已損壞,請(qǐng)嘗試下載查閱"
})
});
},注意,使用前需要下載相應(yīng)的庫(kù),docx-preview工具不適用于渲染doc文件,需要自己去轉(zhuǎn)換文件類型(比如直接修改文件后綴名)
npm install pdfjs-dist npm install docx-preview
以上就是Vue使用pdf.js和docx-preview實(shí)現(xiàn)docx和pdf的在線預(yù)覽的詳細(xì)內(nèi)容,更多關(guān)于Vue文件在線預(yù)覽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用vue 實(shí)現(xiàn)手機(jī)觸屏滑動(dòng)功能
這篇文章主要介紹了用vue 實(shí)現(xiàn)手機(jī)觸屏滑動(dòng)的功能,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Vue導(dǎo)出Excel,后端返回的文件流,前端接收后無(wú)法打開(kāi)文件的解決
在使用Vue導(dǎo)出Excel時(shí),如果后端返回文件流,前端接收后無(wú)法打開(kāi)文件,通常是由于響應(yīng)類型設(shè)置不正確導(dǎo)致的,通過(guò)設(shè)置axios請(qǐng)求接口時(shí)的響應(yīng)類型為`blob`,并使用blob轉(zhuǎn)換文件流,可以解決文件損壞無(wú)法打開(kāi)的問(wèn)題2025-12-12
Vue中Class和Style實(shí)現(xiàn)v-bind綁定的幾種用法
項(xiàng)目開(kāi)發(fā)中給元素添加/刪除 class 是非常常見(jiàn)的行為之一, 例如網(wǎng)站導(dǎo)航都會(huì)給選中項(xiàng)添加一個(gè) active 類用來(lái)區(qū)別選與未選中的樣式,那么在 vue 中 我們?nèi)绾翁幚磉@類的效果呢?下面我們就一起來(lái)了解一下2021-05-05
Vue使用pdf.js和docx-preview實(shí)現(xiàn)docx和pdf的在線預(yù)覽
這篇文章主要為大家詳細(xì)介紹了在Vue中使用pdf.js和docx-preview實(shí)現(xiàn)docx和pdf的在線預(yù)覽的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),需要的可以參考下2025-03-03
vue實(shí)現(xiàn)手機(jī)驗(yàn)證碼登錄
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)手機(jī)驗(yàn)證碼登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
用vue寫(xiě)一個(gè)仿簡(jiǎn)書(shū)的輪播圖的示例代碼
本篇文章主要介紹了用vue寫(xiě)一個(gè)仿簡(jiǎn)書(shū)的輪播圖的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue側(cè)邊欄動(dòng)態(tài)生成下級(jí)菜單的方法
今天小編就為大家分享一篇vue側(cè)邊欄動(dòng)態(tài)生成下級(jí)菜單的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09

