【wangEditor 5】在线解析本地word,将内容展现在wangEditor中

news/2024/10/23 9:27:06/

最近有个问题,在word中复制的多张图片,或者同时复制了图片和文字,图片粘贴到编辑器中不显示。

原因很简单:浏览器无法直接访问本地资源下的文件,切记这一点,不要试图用浏览器直接访问你本地文件。因为从技术角度来讲,这样是非常危险的,这也是我在尝试了一天后下班在路上才反应过来的。

Not allowed to load local resource: 
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg

所以在沟通后,需求就从直接复制变成了在线解析word,这样根据我前几天的经验,瞬间就变得简单了很多

技术点

FileReader

FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
我们用到了FileReader的readAsArrayBuffer方法,该方法的作用为:启动读取指定的 Blob 或 File 内容,当读取操作完成时,返回一个 ArrayBuffer 对象以表示所读取文件的数据
使用方法:

		const reader = new FileReader();reader.onload = function (evt: any) {//当文件读取完毕后console.log(evt)}reader.readAsArrayBuffer(file);// 启动读取指定的 Blob 或 File 内容

mammoth

这个依赖会将word解析成HTML,真的是超级好用,安装

npm install mammoth --save

思路

1、新建一个input标签,设置type为file,隐藏这个标签
2、在wangEditor注册一个自定义菜单,点击它的时候调用input,进行文件选择上传
3、使用FileReader读取对象
4、使用mammoth将word解析成html
5、将HTML展现在富文本编辑器上

操作

1、新建一个input标签,设置type为file,隐藏这个标签,设置只能选择word文档,通过change事件获取选择的文件,使用mammoth解析后将HTML展现在富文本编辑器上

<input v-show="false" id="changeFile" ref="fileRef" type="file" @change="fileChange" accept=".doc,.docx">
	//文件选择事件async fileChange(res: any) {if (res.srcElement.files && res.srcElement.files.length > 0) {//判断是否选择了文件const value: any = await this.analysisWord(res.srcElement.files[0])//解析wordconst editor: any = this.editor//editor的定义在富文本加载时事件中,可以去官网文档看onCreated方法editor.dangerouslyInsertHtml(value)//粘贴html格式的内容res.target.value=''//一定要清空,不然连续两次选择同一文件会不触发本事件}},//解析wordanalysisWord(file: any) {return new Promise((resolve) => {const reader = new FileReader();reader.onload = function (evt: any) {//当文件读取完毕后mammoth//调用mammoth组件的方法进行解析文件.convertToHtml({ arrayBuffer: evt.target.result }).then(function (resultObject) {resolve(resultObject.value);//将处理好的html数据返回});}reader.readAsArrayBuffer(file);// 启动读取指定的 Blob 或 File 内容 :https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsArrayBuffer})},

2、注册菜单,本部门建议参照教程,已经写的非常细致了,我会把自己的ts文件放在下面,可以用作参考,重点在最后的emit

import { IButtonMenu, IDomEditor } from '@wangeditor/editor'class MyWordMenu implements IButtonMenu {public title:string; //菜单标题public tag:string; //菜单类型public iconSvg:string; //按钮图标,可为空constructor() {this.title = '解析word' // 自定义菜单标题this.iconSvg='<svg>...</svg>'this.tag = 'button'}// 获取菜单执行时的 value ,用不到则返回空 字符串或 falsegetValue(editor: IDomEditor): string | boolean {return false}// 菜单是否需要激活(如选中加粗文本,“加粗”菜单会激活),用不到则返回 falseisActive(editor: IDomEditor): boolean {return false}// 菜单是否需要禁用(如选中 H1 ,“引用”菜单被禁用),用不到则返回 falseisDisabled(editor: IDomEditor): boolean {return false}// 点击菜单时触发的函数exec(editor: IDomEditor, value: string | boolean) {if (this.isDisabled(editor)) returneditor.emit('open-word')//这里通知页面触发了点击事件}}
export default MyWordMenu;

3、当监听到点击事件后,手动触发input,打开文件选择窗口,这两行代码我是放在了onCreated事件中

	  //富文本加载时onCreated(editor: any) {this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错const toolbarConfig: any = this.toolbarConfigtoolbarConfig.insertKeys = {//插入自定义的菜单index: 20, // 插入的位置,基于当前的 toolbarKeyskeys: ['openWord']}//下面就是监听事件了const editor1: any = this.editoreditor1.on('open-word', this.openWord)//监听开启word解析功能},//开启文本解析功能并打开文件选择器openWord() {const changeFile: any = document.getElementById("changeFile")changeFile.click();},

效果如下

wangEdit-解析word

Demo

https://gitee.com/zhao-liangchao/wang-edit5-word
(包含复制粘贴word图片与文字混合内容解决方案)


http://www.ppmy.cn/news/651674.html

相关文章

wangEditor富文本编辑器获取html内容

该示例为官方示例&#xff0c;代码仅供参考。 功能&#xff1a;获取html内容&#xff0c;目录结构如下&#xff1a; get-html.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA…

vue 使用wangEditor

1、npm install wangeditor/core wangeditor/editor wangeditor/editor-for-vue 2、封装组件 MyEditor.vue, &#xff08;这里是通过props content 将展示内容传入&#xff09; <template><div><div style"border: 1px solid #ccc; margin-top: 10px&quo…

vue2使用wangEditor

vue2使用wangEditor 前几天一个月薪35k的兄弟&#xff0c;给我推了一个人工智能学习网站&#xff0c;看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有&#xff0c;很详细&#xff0c;分享给大家。大家及时保存&#xff0c;说不定啥时候就没了。 效果 wang…

wangEditor的一些坑记录

1、在vue中使用wangEditor 网上的资料一堆&#xff0c;但基本都是wangEditor3的运用&#xff0c;wangEditor4只需要把customConfig 改成config即可。 例如&#xff1a;关于在vue项目中使用wangEditor 2、标题样式、斜体样式不生效 感谢文章&#xff1a;https://blog.csdn.ne…

vue2 cli使用wangEditor ( wangEditor安装依赖, wangEditor.vue文件实例, wangEditor工具栏配置的key列表 )

wangEditor官网地址https://www.wangeditor.com/ 安装依赖 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangeditor/editor-for-vue # 或者 npm install wangeditor/editor-for-vue --save xxx.vue文件示例 <template><div s…

富文本编辑器wangEditor回显问题

回显时渲染dom报错问题&#xff1a; 富文本编辑器在回显html时偶尔会报以下错误&#xff1a; Error in v-on handler: "Error: Cannot find a descendant at path [1,1,0] in node: {“children”:[],“operations”:[{“type”:“remove_node”,“path”:[0],“node”:…

wangeditor安装

在没有搭建Vue-CLI的情况下安装wangeditor&#xff0c;官网原代码输入命令行后报错。 解决&#xff1a;把去掉&#xff0c;即可安装成功。 即输入npm install wangeditor --save

wangEditor介绍(入门级)

一、什么是富文本编辑器&#xff1f; 相信很多小伙伴都用过富文本编辑器。富文本编辑器&#xff08;Rich Text Editor&#xff0c;RTE&#xff09;是一种可内嵌于浏览器&#xff0c;所见即所得的文本编辑器。可以实现很多功能&#xff0c;如改变字体颜色&#xff0c;插入图片视…