tinymce编辑器导入docx、doc格式Word文档完整版

news2024/11/25 18:39:37

看此文章之前需要注意一点

在前端使用导入Word文档并自动解析成html再插入到tinymce编辑器中,在这里我使用的是mammoth.js识别Word内容,并set到编辑器中,使用mammoth只可解析.docx格式的Word,目前的mammoth不支持.doc格式,后续升级也许会加上解析doc的功能。

为什么解析不了.doc

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

代码思路:docx文档使用mammoth来解析,并set到编辑器中,doc文档走后台java处理(之前写过一篇doc的java处理,可以点开参看一下),返回html结果并set到编辑器中。

tinymce具体使用方法可以参考tinymce中文操作手册,这里不做过多解释,都挺简单,动手操作一下就会的东西。

依赖两个第三方JavaScript库,分别是 tinymce.min.js(库)mammoth.browser.js(单独文件)
·
可以不用去网上下载,在我个人中心下载资源中就有,可以免费下载,只是需要注意一点 tinymce.min.js 中插件有很多,可能我的js库不是很全,但是日常处理Word文档的能力绝对够用,图片的话我这里处理的是直接复制粘贴到编辑器中即可,并没有做图片上传,图片上传需要结合后台一起操作,并且上传成功后如果页面删除还要做删除操作,以免有垃圾图片数据。

在这里插入图片描述
上传Word会弹出文件资源选择器,选择要上传的Word即可。

上传成功后

在这里插入图片描述
基本可以还原百分之90左右的格式,会有一些不兼容的存在,图片不会自动设置大小,但是在编辑器中可以自己设置。

tinymce.init({
                selector: '#conTextarea',  //访问的容器可以是text域,可以是div,自己随意操作。
                branding: false,
                promotion: false,
                statusbar: false,  // 禁用状态栏
                height: 900,
                language: 'zh-Hans',
                plugins: "image,table,advlist,fullscreen,link,lists,preview,searchreplace,insertdatetime,charmap",//image imagetools
                toolbar: ['fontselect | formatselect | fontsizeselect | forecolor backcolor | bold italic underline strikethrough | image | table | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | preview  hr | undo redo | fullscreen searchreplace |print | customUploadBtn'],
                file_picker_callback: function(callback, value, meta) {
                    // 打开选择文件的弹窗
                    var input = document.createElement('input');
                    input.type = 'file';
                    input.accept = 'image/*';

                    input.onchange = function () {
                        var file = input.files[0];
                        // 将文件转换成base64编码
                        var reader = new FileReader();
                        reader.onloadend = function () {
                            var base64 = reader.result;
                            // 将base64编码插入到编辑器的当前光标位置
                            callback(base64, {
                                alt: ''
                            });
                        };
                        reader.readAsDataURL(file);
                    };
                    input.click();
                },
                setup: function (editor) {
                    // 注册自定义按钮
                    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) {
                                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) {
                                        var base64Data = arrayBufferToBase64(arrayBuffer);
                                        console.log(base64Data);
                                        mammoth.convertToHtml({ arrayBuffer: arrayBuffer })
                                            .then(displayResult, function (error) {
                                                console.error(error);
                                            });
                                    });
                                } else if(extension === 'doc') {
                                    readFileInputEventAsArrayBuffer(event, function (arrayBuffer) {
                                        //base64文件流
                                        var base64Data = arrayBufferToBase64(arrayBuffer);
                                        var result ="后台请求";
                                        alert(result);
                                        console.log(base64Data);
                                    });
                                    //tinymce的set方法将内容添加到编辑器中
                                    tinymce.activeEditor.setContent(result);
                                }
                            }

                            function displayResult(result) {
                                //tinymce的set方法将内容添加到编辑器中
                                tinymce.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();
                        }
                    });
                }
            })

tinymce保存内容,是以html形式进行保存,此处自行处理,可以保存到后台生成TXT,也可以直接生成html文件,也可以导出成PDF。

说一下tinymce的优缺点

优点:

1、易于使用:TinyMCE 的用户界面类似于传统的字处理软件,因此它易于使用。用户可以通过在文本框中输入文本,或直接向文本框中添加文本、图片和其他媒体类型。
·
2、高度可定制性:TinyMCE 提供了大量的可定制选项,让开发人员可以根据自己的需要对编辑器进行设置和配置。它允许开发人员添加和删除各种按钮、工具栏和插件,以满足特定的编辑要求和轻度自定义设置。
·
3、支持多语言:TinyMCE 可以配置成支持不同的语言。这意味着用户可以选择在他们熟悉的语言中使用编辑器,在全球范围内获得广泛的使用。
·
4、易于整合:TinyMCE 支持与许多其他平台和应用程序的集成。例如,WordPress、Drupal 和 Joomla 等 CMS 平台都使用 TinyMCE 作为其默认的内容编辑器。

缺点:

1、不适用于所有项目:尽管 TinyMCE 的可定制性和高度变更炫技术完全可以满足多数项目的需求,但此编辑器并不适用于所有项目和场景。例如,如果您的应用程序对内容的编辑控制较弱,则 TinyMCE 可能会提供过多的编辑控件,导致用户出现困惑。
·
2、复杂性:虽然 TinyMCE 是一种易于使用的编辑器,但它是一个十分复杂的项目,需要时间和精力来学习和配置。
·
3、过时的技术:虽然 TinyMCE 一直处于活跃的开发状态,但在某些方面,它可能使用了较过时的技术。例如,它可能没有采用像 React 或 AngularJS 这样新的框架。

总之,TinyMCE 作为一种流行的 Web 富文本编辑器,在许多方面都提供了极高的灵活性和定制性,但是在某些情况下并不适合所有的应用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ghost Buster Pro for mac(快速清理卸载的应用残存文件)

Ghost Buster Pro for mac可从您已卸载的应用程序中查找并删除文件。该应用程序速度快如闪电&#xff0c;可立即释放内存。 许多应用程序都安装在计算机上&#xff0c;但它们通常只会在您的计算机上停留很短的时间。每个应用程序都会创建文件&#xff0c;但删除应用程序不会删…

01 - 如何制定性能调优标准?

1、为什么要做性能调优&#xff1f; 一款线上产品如果没有经过性能测试&#xff0c;那它就好比是一颗定时炸弹&#xff0c;你不知道它什么时候会出现问题&#xff0c;你也不清楚它能承受的极限在哪儿。 有些性能问题是时间累积慢慢产生的&#xff0c;到了一定时间自然就爆炸了…

使用dhtmlx-gantt甘特图插件定制预约表【实战】

示例传送门 定制预约表展示 一、安装 npm i dhtmlx-gantt二、配置解释与汇总 //自定义表头列 gantt.config.columns = [{name: "

服务器部署 Python 项目总结

title: 服务器部署 Python 项目总结 date: 2023-07-05 16:33:49 tags: 服务器Python categories:服务器 cover: https://cover.png feature: false 1. 准备 Python 项目需要 Python 的环境&#xff0c;假如服务器操作系统为 CentOS 7 的话&#xff0c;默认安装了 Python2 与 …

安达发|APS高级排程系统界的天花板!

APS 系统不仅为生产部门提供制造依据&#xff0c;而且涉及到采购计划、安全库存、订单交付等方面。这是非常复杂的管理。一个易于使用的 APS 系统不仅能够充分整合生产相关业务流程&#xff0c;保证生产计划的顺利进行&#xff0c;而且能够大大提高生产效率&#xff0c;降低管理…

导出python环境的所有安装包

导出操作 pip freeze > requests.txt批量导入操作 pip install -r requests.txt

redis数据类型基本操作(list,string,hash,keys相关操作),mongodb(增删改查)

1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; &#xff08;3&#xff09; 数值类型自增1&#xff1a; &#xff08;4&#xff09; 数值类型自减1&#xff1a; &#xff08;5…

Java面试突击

Java面向对象有哪些特征&#xff0c;如何应用 ​ 面向对象编程是利用类和对象编程的一种思想。万物可归类&#xff0c;类是对于世界事物的高度抽象 &#xff0c;不同的事物之间有不同的关系 &#xff0c;一个类自身与外界的封装关系&#xff0c;一个父类和子类的继承关系&…

三菱PLC 控制灯一秒钟交替闪烁

三菱PLC中常用的特殊继电器&#xff1a; M8000 上电一直ON标志 M8002 上电导通一次 M8004 PLC出错 M8005 PLC备用电池电量低标志 M8011 10ms时钟脉冲 M8012 100ms时钟脉冲 M8013 1s时钟脉冲 M8014 1min时钟脉冲 M8034…

【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析

目录 一、介绍 二、使用方法 1.推理 2.训练 三、MPRNet结构 1.整体结构 2.CAB(Channel Attention Block) 3.Stage1 Encoder 4.Stage2 Encoder 5.Decoder 6.SAM(Supervised Attention Module) 7.ORSNet(Original Resolution Subnetwork) 四、损失函数 1.Charbonni…

[LINUX]之grep文本过滤

linux通过使用grep -v操作来实现文本过滤 新创建文本如下 执行过滤命令如下&#xff0c;已经过滤了test3 cat test.txt |grep -v "test3"

Dockerd的迁移与备份

1、容器保存为镜像 &#xff08;1&#xff09; 通过以下命令将容器保存为镜像 # 保存nginx容器为镜像 docker commit 容器名称 镜像名称 例如&#xff1a;docker commit mynginx mynginx_i&#xff08;2&#xff09;用 docker ps -a 查看所有的容器 &#xff08;3&#xf…

15-C++基本算法-贪心法

&#x1f4da; 理论基础 贪心法&#xff08;Greedy Algorithm&#xff09;是一种常见的算法思想&#xff0c;它在每一步选择中都采取当前状态下最优的选择&#xff0c;以期望获得全局最优解。贪心法通常适用于问题具有最优子结构和贪心选择性质的情况。 适用场景 贪心法适用…

react 实现浮动可吸附悬浮窗,悬浮球,悬浮按钮,支持拖动拖拽功能(suspend-button)

前言&#xff1a; 最近在做移动端&#xff0c;有个需求是 实现一个浮动球可拖拽&#xff0c;能吸附&#xff08;吸附到 左右两则&#xff0c;距离哪进就吸附到哪边&#xff09;。 实现过程&#xff1a; 使用 suspend-button &#xff08;但是此组件不支持 ts 和pc端&#x…

VMWare安装统信UOS虚拟机

单击 创建新的虚拟机 按钮&#xff0c;然后选择 自定义&#xff0c; 然后 下一步 硬件兼容性 选择 Workstation16.x &#xff0c;然后 下一步 选择“稍后安装操作系统”&#xff0c; 然后 下一步 选择 Linux &#xff0c; 再选 版本 CentOS 8 64位/ Ubuntu 均可&#xff0c;然…

【数据结构之树】初阶数据结构之树的实现及其各种方式(上)

文章目录 &#x1f60f;专栏导读&#x1f916;文章导读&#x1f640;树的预备知识&#x1f640;二叉树&#x1f633;树的代码实现及其各类讲解&#x1f332;树的结构体初始化 总结 &#x1f60f;专栏导读 &#x1f47b;作者简介&#xff1a;M malloc&#xff0c;致力于成为嵌入…

LinkNet分割模型搭建

原论文&#xff1a;LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation 直接步入正题~~~ 一、LinkNet 1.decoder模块 class DecoderBlock(nn.Module):def __init__(self, in_channels, n_filters): #512, 256super(DecoderBlock, self).__in…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 …

关于21电赛数字识别

这里我们只讲数字识别的代码。 关于模型的训练,这里就不多讲了,看我的这篇文章: K210学习篇(八)在MaixHub训练模型_ODF..的博客-CSDN博客 这里着重讲我们得到训练后的模型该怎么去修改以及和stm32单片机通信。 当我们把下载的模型解压后,就得到一些这些文件,我们只需…

EasyDSS视频直播点播平台如何修改登录密码与开启接口鉴权?

随着互联网的发展&#xff0c;网络安全问题也越来越受到重视。近期我们也对旗下所有的视频平台进行了技术升级&#xff0c;以增强平台的数据安全性&#xff0c;保障用户的信息安全。用户也可以通过以下指导步骤&#xff0c;对平台相关配置进行修改&#xff0c;提高保护等级。 1…