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 文档的外观有所不同
相关推荐
共享家952718 小时前
搭建 AI 聊天机器人:”我的人生我做主“
前端·javascript·css·python·pycharm·html·状态模式
Halo_tjn19 小时前
基于封装的专项 知识点
java·前端·python·算法
摘星编程20 小时前
OpenHarmony环境下React Native:自定义useTruncate文本截断
javascript·react native·react.js
Duang007_20 小时前
【LeetCodeHot100 超详细Agent启发版本】字母异位词分组 (Group Anagrams)
开发语言·javascript·人工智能·python
2601_949868361 天前
Flutter for OpenHarmony 电子合同签署App实战 - 主入口实现
开发语言·javascript·flutter
m0_748229991 天前
Vue2 vs Vue3:核心差异全解析
前端·javascript·vue.js
2601_949593651 天前
高级进阶React Native 鸿蒙跨平台开发:LinearGradient 背景渐变与主题切换
react native·react.js·harmonyos
C澒1 天前
前端监控系统的最佳实践
前端·安全·运维开发
xiaoxue..1 天前
React 手写实现的 KeepAlive 组件
前端·javascript·react.js·面试
摘星编程1 天前
在OpenHarmony上用React Native:自定义useHighlight关键词高亮
javascript·react native·react.js