JavaScript使用docx-preview實現(xiàn)word文檔預(yù)覽的完整步驟
一、安裝依賴
首先安裝 docx-preview 核心庫,以及可能需要的輔助庫(如處理文件讀取的 file-saver 可選):
bash npm install docx-preview --save # 或 yarn add docx-preview
二、基礎(chǔ)使用:預(yù)覽本地/遠(yuǎn)程 .docx 文件
場景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;
// 驗證文件類型
if (file.type !== 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
alert('請上傳 .docx 格式的文件');
return;
}
try {
// 清空之前的預(yù)覽內(nèi)容
previewRef.current.innerHTML = '';
// 解析并渲染 Word 文檔
await renderAsync(
file, // 上傳的文件對象
previewRef.current, // 掛載預(yù)覽的 DOM 容器
null, // 配置項(可選)
{
// 加載狀態(tài)回調(diào)(可選)
onLoadStart: () => console.log('開始加載...'),
onLoadEnd: () => console.log('加載完成'),
}
);
} catch (err) {
console.error('解析失?。?, err);
previewRef.current.innerHTML = '文檔解析失敗,請檢查文件是否損壞';
}
};
return (
<div>
<input type="file" accept=".docx" onChange={handleFileChange} />
<div ref={previewRef} style={{ marginTop: 20, minHeight: 300 }} />
</div>
);
};
export default DocxPreview;
場景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('文件請求失敗');
// 將響應(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;
三、高級配置:自定義渲染效果
renderAsync 方法的第三個參數(shù)是配置對象,可自定義樣式、忽略部分內(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, // 是否忽略最后一個分頁符
experimental: false, // 是否啟用實驗性功能
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 會帶有基礎(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;
}
五、注意事項
- 文件格式限制:僅支持
.docx(Office 2007+),不支持.doc(舊版二進(jìn)制格式),如需支持.doc需后端轉(zhuǎn)換(如用libreoffice或poi)。 - 跨域問題:預(yù)覽遠(yuǎn)程文件時,服務(wù)器需配置 CORS 允許前端域名訪問,否則會報跨域錯誤。
- 復(fù)雜格式兼容性:對復(fù)雜表格、公式、特殊符號的渲染可能存在偏差,復(fù)雜場景建議結(jié)合后端轉(zhuǎn)換為 PDF 預(yù)覽。
- 性能:大文件(如超過 10MB)可能導(dǎo)致渲染緩慢,建議前端限制文件大小或后端分片處理。
以上就是JavaScript使用docx-preview實現(xiàn)word預(yù)覽的完整步驟的詳細(xì)內(nèi)容,更多關(guān)于JavaScript docx-preview預(yù)覽word的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用JavaScript實現(xiàn)等比縮放的幾種常見方法
這篇文章主要介紹了如何使用JavaScript對HTML中的元素和任意DOM元素進(jìn)行等比縮放,通過獲取容器或元素的尺寸信息,計算縮放比例,并應(yīng)用CSS變換(transform屬性)來實現(xiàn)等比縮放,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
js如何去除數(shù)組中的empty?undefined空項
這篇文章主要介紹了js如何去除數(shù)組中的empty?undefined空項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
JavaScript實現(xiàn)將毫秒數(shù)轉(zhuǎn)換為易讀時長格式
在許多開發(fā)場景中,我們通常需要將后端接口返回的毫秒數(shù)轉(zhuǎn)換成更易讀的時長格式,本文將封裝一個簡潔的 JavaScript 函數(shù)實現(xiàn)這一功能,需要的可以了解下2025-02-02
JavaScript使用canvas實現(xiàn)手寫簽名功能
最近遇到一個h5手寫簽名的需求,按理說這種功能網(wǎng)上隨便一搜一大把現(xiàn)成的源碼和組件,但是像這種比較經(jīng)典又很簡單的功能,還是要弄清楚到底怎么實現(xiàn)的,所以接下來本文就給大家介紹一下如何用canvas實現(xiàn)手寫簽名功能2023-08-08
javascript刪除html標(biāo)簽函數(shù)cIsHTML
這篇文章主要介紹了javascript刪除html標(biāo)簽函數(shù)cIsHTML,需要的朋友可以參考下2017-01-01

