word預(yù)覽-2025-05-16

只需幾行代碼,你就能在瀏覽器中完美預(yù)覽 Word 文檔,甚至連表格樣式、頁眉頁腳都原汁原味地呈現(xiàn)出來。

本文使用 docx-preview 插件來源

1. 安裝

npm install docx-preview

2. 使用

新增 docxPreview.ts 文件

import { renderAsync } from "docx-preview";

export const previewDocx = async (fileUrl: string) => {
  try {
    // 獲取文件
    const response = await fetch(fileUrl);
    const docxBlob = await response.blob();
    console.log("獲取到的文件:", docxBlob);
    // 創(chuàng)建一個新的 window 對象用于展示內(nèi)容,用于新窗口打開
    const previewWindow = window.open("", "_blank");
    if (!previewWindow) {
      alert("請允許彈出窗口以預(yù)覽文檔");
      return;
    }

    // 渲染到頁面上
    const container = previewWindow.document.body!;
    await renderAsync(docxBlob, container, undefined, {
      className: "custom-docx", // 自定義CSS類名前綴
      inWrapper: true, // 是否使用包裝容器
      ignoreWidth: false, // 是否忽略頁面寬度
      ignoreHeight: false, // 是否忽略頁面高度
      breakPages: true, // 是否分頁顯示
      renderHeaders: true, // 是否顯示頁眉
      renderFooters: true, // 是否顯示頁腳
      renderFootnotes: true, // 是否顯示腳注
      renderEndnotes: true, // 是否顯示尾注
      renderComments: true, // 是否顯示評論
      useBase64URL: false, // 使用Base64還是ObjectURL處理資源
    });

    console.log("文檔渲染成功!");
  } catch (error) {
    console.error("渲染文檔時出錯:", error);
  }
};

說明:const previewWindow = window.open("", "_blank"); 用作于新窗口打開

3. 使用

<Button
  onClick={() => {
    previewDocx("http://localhost:5173/src/assets/file/AI_100016299002.docx");
  }}
>
  預(yù)覽docx
</Button>;
  • 預(yù)覽效果:
    預(yù)覽.png

4. 優(yōu)缺點

  • 優(yōu)點:效果很贊!文檔分頁顯示,目錄、頁眉頁腳、表格邊框樣式都完美呈現(xiàn)。

  • 缺點:不過也有些小坑:

    • 文檔特別大時,渲染速度會變慢
    • 一些復(fù)雜的 Word 功能可能顯示不完美

5. API

// 將文檔渲染到指定元素
renderAsync (
    document:Blob  |  ArrayBuffer  |  Uint8Array , //可以是 JSZip.loadAsync 支持的任何類型
    bodyContainer:HTMLElement , //用于渲染文檔內(nèi)容的元素,
    styleContainer:HTMLElement , //用于渲染文檔樣式、數(shù)字、字體的元素。如果為 null,則使用 bodyContainer。
    options:{ 
        className:string  =  “docx” , //默認(rèn)和文檔樣式類的類名/前綴
        inWrapper:boolean  =  true , //啟用圍繞文檔內(nèi)容的包裝器渲染
        hideWrapperOnPrint:boolean  =  false , //在打印時禁用包裝器樣式
        ignoreWidth:boolean  =  false , //禁用渲染頁面寬度
        ignoreHeight:boolean  =  false , //禁用渲染頁面高度
        ignoreFonts:boolean  =  false , //禁用字體渲染
        breakPages:boolean  =  true , //啟用分頁分頁符
        ignoreLastRenderedPageBreak:boolean  =  true , //禁用 lastRenderedPageBreak 元素上的分頁
        experiment:boolean  =  false , //啟用實驗性功能(制表位計算)
        trimXmlDeclaration:boolean  =  true , //如果為 true ,則在解析之前將從 xml 文檔中刪除 xml 聲明
        useBase64URL:boolean  =  false , //如果為 true ,則圖像、字體等將轉(zhuǎn)換為 base 64 URL,否則使用 URL.createObjectURL 
        renderChanges:false , //啟用文檔更改的實驗性渲染(插入/刪除)
        renderHeaders:true , //啟用頁眉渲染
        renderFooters:true , //啟用頁腳渲染
        renderFootnotes:true, //啟用腳注渲染
        renderEndnotes : true , //啟用尾注渲染
        renderComments : false , //啟用實驗性評論渲染
        renderAltChunks : true , //啟用 altChunks (html 部分) 渲染
        debug : boolean  =  false , //啟用附加日志記錄
    } ) : Promise < WordDocument >

/// ==== 實驗性/內(nèi)部 API === 
// 此 API 可用于在渲染之前修改文檔
// renderAsync = parseAsync + renderDocument

// 解析文檔并返回內(nèi)部文檔對象
parseAsync ( 
    document : Blob  |  ArrayBuffer  |  Uint8Array , 
    options : Options 
) : Promise < WordDocument >

// 將內(nèi)部文檔對象渲染到指定容器中
renderDocument ( 
    wordDocument : WordDocument , 
    bodyContainer : HTMLElement , 
    styleContainer : HTMLElement , 
    options : Options 
) : Promise < void >
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容