word文件预览实现

Mammoth 是一个专门用于将 .docx 文件转换为 HTML 的 JavaScript 库。它能够保留大部分文档格式,如段落、标题、列表、表格、图片等。

import mammoth from 'mammoth';

一、文件处理流程

文件读取与转换

js 复制代码
const handleFileUpload = async (e) => {
    const uploadedFile = e.target.files[0];
    
    if (!uploadedFile) return;

    setFile(uploadedFile);
    setLoading(true);
    setError(null);
    setSignatureImage(null); // 清除之前的签名
    
    // 获取文件类型
    const fileExtension = uploadedFile.name.split('.').pop().toLowerCase();
    setFileType(fileExtension);
    
    try {
      // 根据文件类型进行不同处理
      if (fileExtension === 'pdf') {
        
      } else if (['xlsx', 'xls'].includes(fileExtension)) {
        
      } else if (['docx'].includes(fileExtension)) {
        // 处理Word文件,使用mammoth库
        const reader = new FileReader();
        reader.onload = async (e) => {
          try {
            const arrayBuffer = e.target.result;
            const result = await mammoth.convertToHtml({ arrayBuffer });
            setWordContent(result.value);
            setLoading(false);
          } catch (err) {
            console.error('Error rendering Word document:', err);
            setError('Word文档处理失败,请检查文件格式是否正确');
            setLoading(false);
          }
        };
        reader.onerror = () => {
          setError('文件读取失败');
          setLoading(false);
        };
        reader.readAsArrayBuffer(uploadedFile);
      } else {
        setLoading(false);
      }
    } catch (err) {
      console.error('Error processing file:', err);
      setError('文件处理失败');
      setLoading(false);
    }
  };
  1. 首先,使用 FileReader 将上传的文件读取为 ArrayBuffer(二进制数据缓冲区)
  2. reader.readAsArrayBuffer(uploadedFile) 开始读取文件
  3. 当文件读取完成后,触发 onload 事件并执行回调函数
  4. 使用 mammoth.convertToHtml() 方法将 Word 文档的二进制数据转换为 HTML 字符串
  5. 这是一个异步操作,使用 await 等待转换完成
  6. 转换结果存储在 result.value 中,这是一个包含 HTML 标记的字符串
  7. 将 HTML 内容保存到 React 状态 wordContent 中

二、渲染HTML

Word 文档转换为 HTML 后,通过 renderWordPreview 函数渲染到页面:

js 复制代码
// 渲染Word文档内容
const renderWordPreview = () => {
  if (!wordContent) return null;
  
  return (
    <div 
      className="word-preview"
      dangerouslySetInnerHTML={{ __html: wordContent }}
    />
  );
};
  1. 检查 wordContent 是否存在,如果不存在则不渲染任何内容
  2. 使用 React 的 dangerouslySetInnerHTML 属性将 HTML 字符串直接插入到 DOM 中
  3. dangerouslySetInnerHTML 是 React 提供的替代浏览器 DOM 的 innerHTML 属性的方法

三、优势与限制

优势

  • 客户端处理:所有处理都在浏览器中完成,无需服务器端转换
  • 保留格式:mammoth 能够保留大部分 Word 文档的格式
  • 轻量级:不需要安装 Microsoft Office 或其他重量级软件
  • 跨平台:在任何支持现代浏览器的设备上都能工作

限制

  • 复杂格式支持有限:某些高级 Word 功能(如宏、复杂的公式等)可能无法正确显示
  • 性能:对于非常大或复杂的文档,转换可能会较慢
  • 样式:虽然保留了基本格式,但可能与原始 Word 文档的外观有所不同
相关推荐
东风破_7 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
东风破_7 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
浮生望7 小时前
React JWT 登录鉴权实战:Zustand 状态管理 + Axios 拦截器 + 路由守卫完整链路
react.js
蒲公英eric8 小时前
从客户端到服务端:DVWA DOM 型 XSS 模块完整漏洞分析教程
前端·web安全·ai·xss·dvwa·ai安全
单线程_018 小时前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
顶点多余8 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
Setsuna_F_Seiei9 小时前
前端转型 Agent 开发 03 之 Agent Tools - 给 Agent 装上手脚
前端·agent·ai编程
jay神9 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
小磊哥er10 小时前
深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算
javascript·ai编程
kyriewen11 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程