news 2026/4/15 17:42:48

医院电子病历系统用富文本编辑器粘贴Word内容,图片会失真吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
医院电子病历系统用富文本编辑器粘贴Word内容,图片会失真吗?

富文本编辑器集成文档导入与图片自动上传功能开发记录

作为一名技术开发人员,我独立搭建了一个网站,目前正着手解决富文本编辑器中粘贴 Word 图片以及支持多种文档导入且图片自动上传至服务器的问题。以下是我详细的查找过程与开发记录。

一、需求明确

(一)功能需求

  1. 粘贴功能:在百度富文本编辑器 UEditor 中粘贴 Word 内容时,其中的图片能够自动上传到服务器,服务器再将图片保存到对象存储(如阿里云、华为云等)。
  2. 文档导入功能:支持 Word、Excel、PPT、PDF 文档导入到富文本编辑器中,导入后图片同样自动上传至服务器并保存到对象存储,同时要保留文档的样式,包括字体、字号、颜色等信息。

(二)技术环境

  • 前端框架:vue2 - cli
  • 富文本编辑器:百度富文本编辑器 UEditor
  • 后端语言:PHP
  • 数据库:MySQL
  • 服务器:阿里云

二、查找解决方案

(一)在线资源搜索

我首先在各大技术论坛(如 CSDN、掘金)、开源社区(GitHub、Gitee)以及搜索引擎(百度、谷歌)上进行了广泛搜索。输入的关键词包括“UEditor 粘贴 Word 图片自动上传”“UEditor 导入 Word Excel PPT PDF 文档”“vue2 UEditor 文档导入图片上传”等。

在搜索过程中,我发现了一些相关的讨论和技术文章,但大多只是提到了部分功能的实现思路,缺乏完整的代码示例和详细的实现步骤。例如,有些文章介绍了如何通过修改 UEditor 的配置来实现粘贴图片的自动上传,但没有涉及到多种文档导入以及图片上传到对象存储的具体操作。

(二)加入交流群

为了能更直接地与同行交流经验,我加入了 QQ 群 223813913。在群里,我向大家描述了目前遇到的问题和需求,得到了不少热心同行的回应。

有同行建议我参考 UEditor 官方文档中关于自定义插件和后端接口的部分,通过编写自定义插件来实现文档导入和图片上传的功能。还有同行分享了他们之前类似项目的开发经验,提醒我注意文档格式解析的兼容性问题以及图片上传过程中的安全性问题。

三、开发过程

(一)前端部分(vue2 - cli + UEditor)

1. 引入 UEditor

在 vue2 项目中引入 UEditor,我按照官方文档的步骤进行了配置。首先下载 UEditor 的压缩包,解压后将相关文件放置在项目的 public 目录下。然后在 vue 组件中通过动态创建 script 标签的方式引入 UEditor 的 JS 文件,并初始化编辑器。

export default { mounted() { this.initUEditor(); }, methods: { initUEditor() { const script = document.createElement('script'); script.src = '/ueditor/ueditor.config.js'; script.onload = () => { const ueScript = document.createElement('script'); ueScript.src = '/ueditor/ueditor.all.min.js'; ueScript.onload = () => { this.ue = UE.getEditor('editor'); this.bindPasteEvent(); }; document.body.appendChild(ueScript); }; document.body.appendChild(script); }, bindPasteEvent() { this.ue.addListener('ready', () => { this.ue.addListener('afterPaste', this.handlePaste); }); }, handlePaste(html) { // 处理粘贴内容,提取图片并上传 console.log('粘贴内容:', html); // 这里可以添加代码来解析 html 中的图片并触发上传 } } };
2. 处理粘贴事件

为了实现粘贴 Word 图片自动上传,我监听了 UEditor 的afterPaste事件。在事件处理函数中,需要对粘贴的 HTML 内容进行分析,提取出其中的图片元素。由于 Word 粘贴过来的图片可能是以 base64 编码的形式存在,也可能是以外部链接的形式存在,因此需要进行分类处理。

handlePaste(html){constparser=newDOMParser();constdoc=parser.parseFromString(html,'text/html');constimages=doc.querySelectorAll('img');images.forEach(img=>{if(img.src.startsWith('data:image')){// 处理 base64 编码的图片this.uploadBase64Image(img.src);}else{// 处理外部链接图片(这里可能需要根据实际情况进一步处理,比如判断是否为合法链接等)console.log('外部链接图片:',img.src);}});},uploadBase64Image(base64Data){// 提取 base64 数据中的图片类型和纯数据部分constmatches=base64Data.match(/^data:(.+);base64,(.+)$/);if(matches&&matches.length===3){constmimeType=matches[1];constimageData=matches[2];// 调用后端接口上传图片this.$http.post('/api/uploadImage',{imageData:imageData,mimeType:mimeType}).then(response=>{console.log('图片上传成功:',response.data);// 替换编辑器中的图片链接为上传后的链接// 这里需要根据实际情况找到编辑器中对应的图片元素并进行替换}).catch(error=>{console.error('图片上传失败:',error);});}}
3. 文档导入功能

对于文档导入功能,由于 UEditor 本身并不直接支持多种文档的导入,因此需要借助第三方库来进行文档解析。我选择了 mammoth.js 来解析 Word 文档,对于 Excel、PPT 和 PDF,考虑使用相应的解析库(如 SheetJS 解析 Excel,pptxjs 解析 PPT,pdf.js 解析 PDF)。

以 Word 文档导入为例,我在前端添加了一个文件上传按钮,当用户选择 Word 文件后,使用 FileReader 读取文件内容,然后调用 mammoth.js 进行解析,将解析后的 HTML 内容插入到 UEditor 中。

import mammoth from'mammoth'; export default { methods: { handleFileChange(event) { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = (e) => { const arrayBuffer = e.target.result; mammoth.extractRawText({ arrayBuffer: arrayBuffer }) .then(result => { // 这里只是简单获取文本内容,实际需要获取包含样式的 HTML // 更完整的做法是使用 mammoth.convertToHtml mammoth.convertToHtml({ arrayBuffer: arrayBuffer }) .then(htmlResult => { this.ue.setContent(htmlResult.value); // 处理导入文档中的图片(如果有) this.processImportedImages(htmlResult.value); }); }) .catch(error => { console.error('文档解析失败:', error); }); }; reader.readAsArrayBuffer(file); } }, processImportedImages(html) { // 类似于粘贴事件处理中的图片处理逻辑 // 解析 html 中的图片并上传 } } };

(二)后端部分(PHP)

1. 图片上传接口

我编写了一个 PHP 接口来处理前端上传的图片数据。接口接收到图片的 base64 编码数据和图片类型后,将 base64 数据解码为二进制数据,然后上传到阿里云对象存储(OSS)。

'Base64 解码失败']);exit;}try{// 创建 OssClient 实例$ossClient=newOssClient($accessKeyId,$accessKeySecret,$endpoint);// 生成图片文件名$fileName=uniqid().'.'.pathinfo(parse_url($mimeType,PHP_URL_PATH),PATHINFO_EXTENSION);// 上传图片到 OSS$ossClient->putObject($bucket,$fileName,$binaryData);// 返回图片的 OSS 访问链接$objectUrl='https://'.$bucket.'.'.$endpoint.'/'.$fileName;echojson_encode(['url'=>$objectUrl]);}catch(OssException$e){echojson_encode(['error'=>$e->getMessage()]);}?>
2. 文档导入相关接口(预留)

对于文档导入功能,后端可能需要提供一些辅助接口,例如处理文档解析后的数据、存储文档相关信息到 MySQL 数据库等。目前这部分功能还在进一步完善中。

四、遇到的问题与解决方案

(一)图片上传失败

在开发过程中,遇到了图片上传失败的问题。经过排查,发现是由于阿里云 OSS 的权限配置不正确导致的。解决方法是检查并修改 OSS 的 Bucket 权限,确保 PHP 脚本有足够的权限进行文件上传操作。

(二)文档样式丢失

在导入 Word 文档时,发现部分样式(如字体、字号、颜色等)丢失。这是因为使用的文档解析库(mammoth.js)在解析过程中对样式的支持不够完善。解决方案是寻找更强大的文档解析库或者对解析后的 HTML 进行二次处理,手动添加丢失的样式。

五、总结与展望

通过这段时间的查找和开发,我已经基本实现了富文本编辑器中粘贴 Word 图片自动上传以及 Word 文档导入的功能,但 Excel、PPT 和 PDF 文档的导入功能还在进一步完善中。在开发过程中,与同行的交流和分享给了我很多帮助,让我能够更快地解决问题。

接下来,我将继续优化文档导入功能,确保各种文档的样式能够完整保留,并提高图片上传的稳定性和性能。同时,我也会将开发过程中的经验整理成文档,分享给更多的开发者,希望能为大家提供一些参考和帮助。

复制插件目录

引入插件文件

UEditor 1.4.3.3示例

注意:不要重复引入jquery,如果您的项目已经引入了jq,则不用再引入jq-1.4

在工具栏中增加插件按钮

//工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义toolbars:[["fullscreen","source","|","zycapture","|","wordpaster","importwordtoimg","netpaster","wordimport","excelimport","pptimport","pdfimport","|","importword","exportword","importpdf"]]

初始化控件

varpos=window.location.href.lastIndexOf("/");varapi=[window.location.href.substr(0,pos+1),"asp/upload.asp"].join("");WordPaster.getInstance({//上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:api,//为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:"",//设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:"file",//提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:''});//加载控件

注意

如果接口字段名称不是file,请配置FileFieldName。ueditor接口中使用的upfile字段

点击查看详细教程

配置ImageMatch

匹配图片地址,如果服务器返回的是JSON则需要通过正则匹配

ImageMatch:'',

点击参考链接

配置ImageUrl

为图片地址增加域名,如果服务器返回的图片地址是相对路径,可通过此属性添加自定义域名。

ImageUrl:"",

点击查看详细教程

配置SESSION

如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3

效果

编辑器界面

导入Word文档,支持doc,docx

导入Excel文档,支持xls,xlsx

粘贴Word

一键粘贴Word内容,自动上传Word中的图片,保留文字样式。

Word转图片

一键导入Word文件,并将Word文件转换成图片上传到服务器中。

导入PDF

一键导入PDF文件,并将PDF转换成图片上传到服务器中。

导入PPT

一键导入PPT文件,并将PPT转换成图片上传到服务器中。

上传网络图片

下载示例

点击下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 8:11:34

开题报告-基于vue的电商平台功能设计与开发

目录 研究背景与意义研究目标技术选型功能模块设计关键技术实现预期成果创新点 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 研究背景与意义 随着互联网技术的发展和移动设备的普及,电子商…

作者头像 李华
网站建设 2026/4/8 0:17:15

开题报告基于Scrapy的商品销售分析与可视化系统设计与实现

目录 系统概述核心功能模块技术栈创新点应用场景预期成果 项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 系统概述 基于Scrapy的商品销售分析与可视化系统是一个结合网络爬虫、数据分析和可视化技术的综…

作者头像 李华
网站建设 2026/4/14 20:41:47

云安全SRC漏洞挖掘,从零基础到精通,收藏这篇就够了!

很多初涉网络安全的伙伴,或许听说过“云安全SRC”,却不太清楚——它到底是做什么的?发现漏洞不但能帮助企业,自身也能得到奖励,这样怎样入门才不会出错?今日就从基础到实战,把云安全SRC漏洞挖掘…

作者头像 李华
网站建设 2026/4/8 7:22:05

程序员转型AI大模型领域的价值和优势,包括高薪机会、技术前沿性和市场需求_【转行大模型】大龄程序员转行AI大模型

文章介绍了程序员转型AI大模型领域的价值和优势,包括高薪机会、技术前沿性和市场需求。提供了从入门到进阶的完整学习路线,包括提示词工程、平台应用开发、知识库应用、微调开发等多个阶段,并分享了丰富的学习资源,如视频教程、PD…

作者头像 李华
网站建设 2026/4/15 16:18:54

终端里的命运之轮:我与Agent Flow的奇妙旅程

想象一下,你正坐在深夜的终端前,手指在键盘上飞舞,却突然发现自己不是在写代码,而是在导演一场智能代理的冒险剧。每一个节点都是一段对话,每一条分支都是一次命运的选择。过去,Kimi CLI像一位忠实的助手,只等你一句指令就行动;现在,它学会了阅读“剧本”——一张用流…

作者头像 李华
网站建设 2026/4/7 22:36:37

Python BeautifulSoup下载安装教程,解决失败问题

在网络数据采集和解析工作中,BeautifulSoup是一个非常流行的Python库,它能帮助开发者轻松地从HTML或XML文档中提取数据。要使用它,第一步就是正确下载和安装。通常,我们通过Python的包管理工具pip来完成这一过程,但在不…

作者头像 李华