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 文档的外观有所不同
相关推荐
掘金安东尼1 天前
让 JavaScript 更容易「善后」的新能力
前端·javascript·面试
掘金安东尼1 天前
用 HTMX 为 React Data Grid 加速实时更新
前端·javascript·面试
灵感__idea1 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo1 天前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队1 天前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher1 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati1 天前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao1 天前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
亦妤1 天前
JS执行机制、作用域及作用域链
javascript
兆子龙1 天前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构