JavaScript使用docx-preview實(shí)現(xiàn)word文檔預(yù)覽的完整步驟
一、安裝依賴
首先安裝 docx-preview 核心庫,以及可能需要的輔助庫(如處理文件讀取的 file-saver 可選):
bash npm install docx-preview --save # 或 yarn add docx-preview
二、基礎(chǔ)使用:預(yù)覽本地/遠(yuǎn)程 .docx 文件
場(chǎng)景1:預(yù)覽本地上傳的 Word 文件
通過 <input type="file"> 讓用戶上傳 .docx 文件,解析后預(yù)覽:
import React, { useRef } from 'react';
import { renderAsync } from 'docx-preview';
const DocxPreview = () => {
const previewRef = useRef(null); // 用于掛載預(yù)覽內(nèi)容的容器
// 處理文件上傳
const handleFileChange = async (e) => {
const file = e.target.files[0];
if (!file) return;
// 驗(yàn)證文件類型
if (file.type !== 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
alert('請(qǐng)上傳 .docx 格式的文件');
return;
}
try {
// 清空之前的預(yù)覽內(nèi)容
previewRef.current.innerHTML = '';
// 解析并渲染 Word 文檔
await renderAsync(
file, // 上傳的文件對(duì)象
previewRef.current, // 掛載預(yù)覽的 DOM 容器
null, // 配置項(xiàng)(可選)
{
// 加載狀態(tài)回調(diào)(可選)
onLoadStart: () => console.log('開始加載...'),
onLoadEnd: () => console.log('加載完成'),
}
);
} catch (err) {
console.error('解析失?。?, err);
previewRef.current.innerHTML = '文檔解析失敗,請(qǐng)檢查文件是否損壞';
}
};
return (
<div>
<input type="file" accept=".docx" onChange={handleFileChange} />
<div ref={previewRef} style={{ marginTop: 20, minHeight: 300 }} />
</div>
);
};
export default DocxPreview;
場(chǎng)景2:
預(yù)覽遠(yuǎn)程服務(wù)器上的 .docx 文件 通過 fetch 拉取遠(yuǎn)程 .docx 文件(需處理跨域),轉(zhuǎn)換為 ArrayBuffer 后解析:
import React, { useRef, useEffect } from 'react';
import { renderAsync } from 'docx-preview';
const RemoteDocxPreview = () => {
const previewRef = useRef(null);
const docUrl = 'https://example.com/files/test.docx'; // 遠(yuǎn)程 .docx 地址
useEffect(() => {
const fetchAndRenderDoc = async () => {
try {
const response = await fetch(docUrl);
if (!response.ok) throw new Error('文件請(qǐng)求失敗');
// 將響應(yīng)轉(zhuǎn)換為 ArrayBuffer(docx-preview 支持的格式)
const arrayBuffer = await response.arrayBuffer();
// 渲染文檔
await renderAsync(arrayBuffer, previewRef.current);
} catch (err) {
console.error('加載失?。?, err);
previewRef.current.innerHTML = '無法加載遠(yuǎn)程文檔';
}
};
fetchAndRenderDoc();
}, [docUrl]);
return <div ref={previewRef} style={{ padding: 20 }} />;
};
export default RemoteDocxPreview;
三、高級(jí)配置:自定義渲染效果
renderAsync 方法的第三個(gè)參數(shù)是配置對(duì)象,可自定義樣式、忽略部分內(nèi)容等:
// 示例:自定義配置
const options = {
className: 'docx-preview', // 給預(yù)覽容器添加自定義類名(用于覆蓋樣式)
inWrapper: true, // 是否包裹在默認(rèn)容器中(默認(rèn) true)
ignoreWidth: false, // 是否忽略文檔寬度(默認(rèn) false)
ignoreHeight: false, // 是否忽略文檔高度(默認(rèn) false)
ignoreFonts: false, // 是否忽略字體樣式(默認(rèn) false)
breakPages: true, // 是否分頁(默認(rèn) true)
ignoreLastRenderedPageBreak: true, // 是否忽略最后一個(gè)分頁符
experimental: false, // 是否啟用實(shí)驗(yàn)性功能
trimXmlDeclaration: true, // 是否移除 XML 聲明
useBase64URL: true, // 是否用 base64 處理圖片
renderChanges: false, // 是否渲染修訂記錄(默認(rèn) false)
renderHeaders: true, // 是否渲染頁眉(默認(rèn) true)
renderFooters: true, // 是否渲染頁腳(默認(rèn) true)
renderFootnotes: true, // 是否渲染腳注(默認(rèn) true)
renderEndnotes: true, // 是否渲染尾注(默認(rèn) true)
};
// 使用配置
await renderAsync(file, previewRef.current, options);
四、樣式定制 默認(rèn)渲染的 HTML 會(huì)帶有基礎(chǔ)樣式,可通過自定義 CSS 覆蓋:
/* 示例:調(diào)整預(yù)覽區(qū)域樣式 */
.docx-preview {
max-width: 800px;
margin: 0 auto;
padding: 40px;
background: white;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
/* 調(diào)整段落樣式 */
.docx-preview p {
margin: 10px 0;
line-height: 1.5;
}
/* 隱藏頁眉頁腳(如果需要) */
.docx-preview .header,
.docx-preview .footer {
display: none;
}
五、注意事項(xiàng)
- 文件格式限制:僅支持
.docx(Office 2007+),不支持.doc(舊版二進(jìn)制格式),如需支持.doc需后端轉(zhuǎn)換(如用libreoffice或poi)。 - 跨域問題:預(yù)覽遠(yuǎn)程文件時(shí),服務(wù)器需配置 CORS 允許前端域名訪問,否則會(huì)報(bào)跨域錯(cuò)誤。
- 復(fù)雜格式兼容性:對(duì)復(fù)雜表格、公式、特殊符號(hào)的渲染可能存在偏差,復(fù)雜場(chǎng)景建議結(jié)合后端轉(zhuǎn)換為 PDF 預(yù)覽。
- 性能:大文件(如超過 10MB)可能導(dǎo)致渲染緩慢,建議前端限制文件大小或后端分片處理。
以上就是JavaScript使用docx-preview實(shí)現(xiàn)word預(yù)覽的完整步驟的詳細(xì)內(nèi)容,更多關(guān)于JavaScript docx-preview預(yù)覽word的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實(shí)現(xiàn)頁面高亮操作提示和蒙板
這篇文章主要介紹了JavaScript實(shí)現(xiàn)頁面高亮操作提示和蒙板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
使用JavaScript實(shí)現(xiàn)等比縮放的幾種常見方法
這篇文章主要介紹了如何使用JavaScript對(duì)HTML中的元素和任意DOM元素進(jìn)行等比縮放,通過獲取容器或元素的尺寸信息,計(jì)算縮放比例,并應(yīng)用CSS變換(transform屬性)來實(shí)現(xiàn)等比縮放,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
js如何去除數(shù)組中的empty?undefined空項(xiàng)
這篇文章主要介紹了js如何去除數(shù)組中的empty?undefined空項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
微信小程序如何同時(shí)獲取用戶信息和用戶手機(jī)號(hào)
小程序登錄是現(xiàn)在小程序里面很普遍的一個(gè)功能,因?yàn)楣俜教峁┑姆椒?可以一鍵獲取到用戶信息,一鍵拿到手機(jī)號(hào),這篇文章主要給大家介紹了關(guān)于微信小程序如何同時(shí)獲取用戶信息和用戶手機(jī)號(hào)的相關(guān)資料,需要的朋友可以參考下2021-08-08
js阻止瀏覽器默認(rèn)行為的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄猨s阻止瀏覽器默認(rèn)行為的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
JavaScript實(shí)現(xiàn)將毫秒數(shù)轉(zhuǎn)換為易讀時(shí)長(zhǎng)格式
在許多開發(fā)場(chǎng)景中,我們通常需要將后端接口返回的毫秒數(shù)轉(zhuǎn)換成更易讀的時(shí)長(zhǎng)格式,本文將封裝一個(gè)簡(jiǎn)潔的 JavaScript 函數(shù)實(shí)現(xiàn)這一功能,需要的可以了解下2025-02-02
JavaScript使用canvas實(shí)現(xiàn)手寫簽名功能
最近遇到一個(gè)h5手寫簽名的需求,按理說這種功能網(wǎng)上隨便一搜一大把現(xiàn)成的源碼和組件,但是像這種比較經(jīng)典又很簡(jiǎn)單的功能,還是要弄清楚到底怎么實(shí)現(xiàn)的,所以接下來本文就給大家介紹一下如何用canvas實(shí)現(xiàn)手寫簽名功能2023-08-08
javascript刪除html標(biāo)簽函數(shù)cIsHTML
這篇文章主要介紹了javascript刪除html標(biāo)簽函數(shù)cIsHTML,需要的朋友可以參考下2017-01-01

