首页 > 其他分享 >Tinymce富文本添加word导入的支持

Tinymce富文本添加word导入的支持

时间:2023-11-17 17:48:15浏览次数:34  
标签:function word arrayBuffer Tinymce 导入 file var new document

在前端使用导入Word文档并自动解析成html再插入到tinymce编辑器中,可以使用mammoth.js识别Word内容转换为Html并set到编辑器中,使用mammoth只可解析.docx格式的Word,目前的mammoth不支持.doc格式,后续升级也许会加上解析doc的功能。
mammoth.js转换word为html丢失了好多样式,因此不推荐使用,建议统一交由后端转换
如果使用了是Tinymce5,建议直接使用https://github.com/tinymce-plugin/tinymce-plugin 这个插件,效果也不错,但是只支持docx,官方示例地址:https://tinymce-plugin.gitee.io/packages/tp-importword/tpImporatwordDemo.html

为什么解析不了.doc
  • .docx 格式的 Word 文档是一种基于 XML 和 ZIP 压缩技术的文件格式,其文件结构相对固定并且较为简单,可以通过一些开源的 JavaScript 库进行解析和转换。`
    ·
  • .doc 格式的 Word 文档是一种相对来说版本比较老一点并且是二进制格式的文件,文件结构比较复杂,具有较高的私有性和细节,需要专用微软 Office 应用程序才能完整读取。

Tinymce 支持调整

1.添加按钮

在init的setup中添加按钮

import mammoth from "mammoth";
import { ContentTypeEnum } from '@/api/types'
import http from '@/api'

......
    // init中其余的配置[略]
    setup: function (editor: any) {
      // 注册自定义按钮
      editor.ui.registry.addButton("customUploadBtn", {
        text: "上传Word",
        onAction: function () {
          var input = document.createElement("input");
          input.type = "file";
          input.accept = ".doc,.docx";
          // 执行上传文件操作
          input.addEventListener("change", handleFileSelect, false);

          // 获取上传文件base64数据
          function arrayBufferToBase64(arrayBuffer: any) {
            var binary = "";
            var bytes = new Uint8Array(arrayBuffer);
            var len = bytes.byteLength;
            for (var i = 0; i < len; i++) {
              binary += String.fromCharCode(bytes[i]);
            }
            return window.btoa(binary);
          }

          function handleFileSelect(event) {
            var file = event.target.files[0];
            //获取上传文件后缀,如果是docx格式,则使用mammoth来进行解析,
            //如果不是则访问后台,将文件传输流base64传递到后台
            //生成文件,然后用java解析doc,并返回到前台
            var extension = file.name.slice(
              ((file.name.lastIndexOf(".") - 1) >>> 0) + 2
            );
            if (extension === "docx") {
              readFileInputEventAsArrayBuffer(event, function (arrayBuffer: any) {
                var base64Data = arrayBufferToBase64(arrayBuffer);
                console.log(base64Data);
                mammoth
                  .convertToHtml({ arrayBuffer: arrayBuffer }, { ignoreEmptyParagraphs: false, })
                  .then(displayResult, function (error: any) {
                    console.error(error);
                  });
              });
            } else if (extension === "doc") {
              let formData = new FormData()
              formData.append('file', file)
              http
                .post<string>(`/WordToHtml`, formData, {
                  headers: { 'Content-Type': ContentTypeEnum.FORM_DATA },
                })
                .then((json: any) => {
                  tinymceInstance.activeEditor.setContent(json.Data);
                })
                .catch((err) => {
                  console.log(err);
                })

              // readFileInputEventAsArrayBuffer(event, function (arrayBuffer:any) {
              //   //base64文件流
              //   var base64Data = arrayBufferToBase64(arrayBuffer);
              //   var result = "后台请求";
              //   alert(result);
              //   console.log(base64Data);
              // });
              // //tinymce的set方法将内容添加到编辑器中
              // tinymceInstance.activeEditor.setContent(result);
            }
          }

          function displayResult(result) {
            //tinymce的set方法将内容添加到编辑器中
            tinymceInstance.activeEditor.setContent(result.value);
          }

          function readFileInputEventAsArrayBuffer(event, callback) {
            var file = event.target.files[0];
            var reader = new FileReader();
            reader.onload = function (loadEvent) {
              var arrayBuffer = loadEvent.target.result;
              callback(arrayBuffer);
            };
            reader.readAsArrayBuffer(file);
          }

          // 触发点击事件,打开选择文件的对话框
          input.click();
        },
      });
    },
......

2.在按钮的栏目下显示新添加的按钮
  toolbar: () => [
    'print preview fullscreen | customUploadBtn',
  ],

3.后端接口,使用.Net写的,分别尝试了Aspose和Spire,结果是Aspose的转换效果更好

        public IActionResult WordToHtml(IFormFile file)
        {
            string fileName = file.FileName;
            string fileExtension = fileName.Substring(fileName.LastIndexOf(".") + 1);

             Document document = null;
             if (fileExtension.Equals("doc"))
             {
                 document = new Document(file.OpenReadStream(),new LoadOptions(){LoadFormat = LoadFormat.Doc});
             }
             else if (fileExtension.Equals("docx"))
             {
                 document = new Document(file.OpenReadStream(),new LoadOptions(){LoadFormat = LoadFormat.Docx});
             }
             else
             {
                 return new JsonResult(new
                 {
                     Msg = "不被支持的文档类型!"
                 });
             }
             
             HtmlSaveOptions options = new (SaveFormat.Html);
             options.ExportImagesAsBase64 = true;
             MemoryStream stream = new();
             document.Save(stream, options);
             stream.Position = 0;

             StreamReader reader = new(stream);
             string html = reader.ReadToEnd();

            // Document document = new Document();
            // if (fileExtension.Equals("doc"))
            // {
            //     document.LoadFromStream(file.OpenReadStream(),FileFormat.Doc);
            // }
            // else if (fileExtension.Equals("docx"))
            // {
            //     document.LoadFromStream(file.OpenReadStream(),FileFormat.Docx);
            // }
            // else
            // {
            //     return new JsonResult(new
            //     {
            //         Msg = "不被支持的文档类型!"
            //     });
            // }
            // document.HtmlExportOptions.ImageEmbedded = true;
            // document.HtmlExportOptions.IsExportDocumentStyles = true;
            // document.HtmlExportOptions.HasHeadersFooters = true;
            // MemoryStream stream = new();
            // document.SaveToStream(stream, FileFormat.Html);
            // stream.Position = 0;
            //
            // StreamReader reader = new(stream);
            // string html = reader.ReadToEnd();
            return new JsonResult(new
            {
                Data = html,
            });
        }

标签:function,word,arrayBuffer,Tinymce,导入,file,var,new,document
From: https://www.cnblogs.com/fanqisoft/p/17839345.html

相关文章

  • 快手自动关注脚本,导入快手号和ID,按键精灵开源脚本
    用按键精灵写的一个脚本,界面里面你可以导入对方的快手号,也是ID,然后进入主页后启动脚本它会自动一个个给你关注,非常的高效率。ui界面:  ui界面代码:=======================================================界面1:{请在下面设置话术:{输入框:{名称:"输入框1",提示内......
  • 测试某个python库是否正常导入
    我这里的测试代码:python-c"importmagenta"出现错误:/Users/ghj1976/opt/anaconda3/envs/magenta/lib/python3.7/site-packages/librosa/util/decorators.py:9:NumbaDeprecationWarning:Animportwasrequestedfromamodulethathasmovedlocation.Importrequested......
  • 抖音导入ID,UID自动关注脚本,按键精灵开源版工具
    这个源码是按键精灵开发的,前几天刚给客户定制的,这边直接分享出来,你可以自己打开按键精安卓端的,然后把我分享的代码一键粘贴过去就能用。UI界面:  按键精灵完整代码:【手机】==================================================='创建布局名称Dim布局名称,点击坐标,话术,......
  • 盘点一个Python自动化办公需求之word文档图片自动插入
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公的问题,一起来看看吧。下面还给出了他的代码。二、实现过程这里【瑜亮老师】给了一个思路:如下所示:顺着这个思路,粉丝写了一份代码,但是在循环部分好像还存在些问题。后来【瑜亮老师......
  • # yyds干货盘点 # 盘点一个Python自动化办公需求之word文档图片自动插入
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公的问题,一起来看看吧。下面还给出了他的代码。三、总结大家好,我是皮皮。这篇文章主要盘点了一个Python自动化办公之word文档图片自动插入问题,文中针对该问题,给出了具体的解析和代码实现,帮助......
  • C#Winform使用NPOI获取word中的数据
    ......
  • word的实用操作技巧
    1、基本使用操作(1)文本删除:     退格键backspace:删除光标以左的内容     删除键delete:删除光标以右的内容     直接输入会增加字符,按insert键,会切换成改写模式,新字符代替旧字符,总字符数量不会变   常用的在word中使用复制粘贴后,难免有些存......
  • iframe本身就不是动态语言,样式和脚本都需要额外导入.iFrame的本质是内联框架的缩写,它
    以下哪个选项的描述是错误的Aiframe是用来在网页中插入第三方页面,早期的页面使用iframe主要是用于导航栏这种很多页面都相同的部分,这样在切换页面的时候避免重复下载Biframe的创建比一般的DOM元素慢了1-2个数量级Ciframe标签会阻塞页面的的加载Diframe本质是动态语言的Inc......
  • 考试题库通过excel导入试题
    ps:最近在做的考试试题导入,留个痕本人有点菜,实现方式有些简单,各位有什么优化也可以拿去改,0.0;这个方法可以获取对象试题字段的字段值和字段名并且可以根据字段上的注解判断字段是否要处理有类似的业务还是可以用用的一.demo测试代码:publicstaticvoidmain(String[]ar......
  • C#操作Microsoft.Office.Interop.Word类库完整例子
    使用Microsoft.Office.Interop.Word类库操作wor文档一.准备工作首先在工厂中,引用【Microsoft.Office.Interop.Word】,本地安装了world,就能找到这个类库,如下图。Form1系统自动生成的Form1的界面很简单,就一个按钮 二4个完整实例4个实例,自测过的,都可用,适用很多种情况操作wor......