互联网政务平台如何解决微信公众号公式导入?

富文本编辑器集成文档处理与图片上传功能开发全纪实

作为一名独立开发网站的技术人员,近期我正全身心投入到富文本编辑器功能的优化中,重点攻克粘贴 Word 图片以及多种文档导入时图片自动上传和样式保留的难题。以下是我在这一过程中的详细记录。

一、需求精准剖析

(一)核心功能需求

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

(二)技术环境说明

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

二、解决方案探寻之路

(一)网络资源深度挖掘

我充分利用各大技术社区和开源平台展开搜索,在 GitHub、Stack Overflow、掘金等网站输入了诸如“UEditor Spring Boot 粘贴 Word 图片上传”“vue2 UEditor 文档导入样式保留”“Spring Boot 对象存储图片上传”等关键词。

在 GitHub 上,我找到了一些相关的开源项目,但大多功能不够完整。有的项目仅实现了图片上传到本地服务器,未涉及对象存储;有的项目对文档样式保留的处理不够完善,无法满足我的需求。在技术论坛中,一些开发者分享了他们的经验,但大多是零散的思路,缺乏系统性的解决方案。

(二)加入交流群获取实战经验

为了更直接地与同行交流,我加入了 QQ 群 223813913。在群里,我详细描述了项目需求和遇到的问题,得到了众多热心同行的回应。

有同行建议我研究 UEditor 的插件机制,通过自定义插件来实现文档导入和图片上传功能。还有同行分享了他们在 Spring Boot 中集成对象存储服务的代码示例,这为我解决图片上传到云存储的问题提供了重要参考。同时,群里也有同行提到了使用一些第三方库来处理文档解析,这让我有了新的思路。

三、开发实战过程

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

1. UEditor 集成与初始化

首先,我将 UEditor 的相关文件下载并放置在项目的 public 目录下。在 vue 组件中,通过动态创建 script 标签的方式引入 UEditor 的 JS 文件,并初始化编辑器。

export default { mounted() { this.loadUEditorScripts(); }, methods: { loadUEditorScripts() { const configScript = document.createElement('script'); configScript.src = '/ueditor/ueditor.config.js'; configScript.onload = () => { const ueScript = document.createElement('script'); ueScript.src = '/ueditor/ueditor.all.min.js'; ueScript.onload = () => { this.initEditor(); this.bindPasteEvent(); }; document.body.appendChild(ueScript); }; document.body.appendChild(configScript); }, initEditor() { this.ue = UE.getEditor('editor'); }, bindPasteEvent() { this.ue.addListener('ready', () => { this.ue.addListener('afterPaste', this.handlePaste); }); } } };
2. 粘贴事件处理与图片上传

为了实现粘贴 Word 图片自动上传,我在afterPaste事件处理函数中,使用 DOMParser 解析粘贴的 HTML 内容,提取其中的图片元素。对于 base64 编码的图片,我调用后端接口进行上传。

handlePaste(html){constparser=newDOMParser();constdoc=parser.parseFromString(html,'text/html');constimages=doc.querySelectorAll('img');images.forEach(img=>{if(img.src.startsWith('data:image')){this.uploadBase64Image(img.src);}});},uploadBase64Image(base64Data){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);// 替换编辑器中的图片链接为上传后的链接constnewImgSrc=response.data.url;// 这里需要找到编辑器中对应的 img 元素并替换 src 属性,由于 UEditor 内部结构复杂,可能需要进一步研究其 API}).catch(error=>{console.error('图片上传失败:',error);});}}
3. 文档导入功能实现

对于文档导入,我使用了不同的库来处理不同格式的文档。以 Word 文档为例,我使用 Apache POI 结合一些辅助库进行解析。在前端添加文件上传按钮,当用户选择 Word 文件后,使用 FileReader 读取文件内容,通过 HTTP 请求将文件发送到后端进行解析,后端解析完成后返回 HTML 内容,前端再将 HTML 内容插入到 UEditor 中。

export default { methods: { handleWordFileChange(event) { const file = event.target.files[0]; if (file) { const formData = new FormData(); formData.append('file', file); this.$http.post('/api/importWord', formData) .then(response => { this.ue.setContent(response.data.htmlContent); }) .catch(error => { console.error('Word 文档导入失败:', error); }); } } } };

对于 Excel、PPT 和 PDF 文档,我分别使用了 Apache POI 的相关模块和 Apache PDFBox 进行解析,处理逻辑与 Word 文档类似。

(二)后端部分(Spring Boot)

1. 图片上传接口开发

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

importcom.aliyun.oss.OSS;importcom.aliyun.oss.OSSClientBuilder;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.io.ByteArrayInputStream;importjava.util.UUID;@RestController@RequestMapping("/api")publicclassUploadController{@Value("${aliyun.oss.endpoint}")privateStringendpoint;@Value("${aliyun.oss.accessKeyId}")privateStringaccessKeyId;@Value("${aliyun.oss.accessKeySecret}")privateStringaccessKeySecret;@Value("${aliyun.oss.bucketName}")privateStringbucketName;@PostMapping("/uploadImage")publicUploadResultuploadImage(@RequestBodyImageUploadRequestrequest){try{StringfileName=UUID.randomUUID().toString()+getFileExtension(request.getMimeType());byte[]imageBytes=java.util.Base64.getDecoder().decode(request.getImageData());OSSossClient=newOSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);ossClient.putObject(bucketName,fileName,newByteArrayInputStream(imageBytes));ossClient.shutdown();StringobjectUrl="https://"+bucketName+"."+endpoint+"/"+fileName;returnnewUploadResult(objectUrl);}catch(Exceptione){thrownewRuntimeException("图片上传失败",e);}}privateStringgetFileExtension(StringmimeType){switch(mimeType){case"image/jpeg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";default:return".dat";}}}classImageUploadRequest{privateStringimageData;privateStringmimeType;// getters and setterspublicStringgetImageData(){returnimageData;}publicvoidsetImageData(StringimageData){this.imageData=imageData;}publicStringgetMimeType(){returnmimeType;}publicvoidsetMimeType(StringmimeType){this.mimeType=mimeType;}}classUploadResult{privateStringurl;publicUploadResult(Stringurl){this.url=url;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.url=url;}}
2. 文档导入接口开发

对于 Word 文档导入,我使用 Apache POI 进行解析,将文档内容转换为 HTML 格式并返回给前端。

importorg.apache.poi.xwpf.usermodel.*;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjava.io.IOException;importjava.io.InputStream;@RestControllerpublicclassDocumentImportController{@PostMapping("/api/importWord")publicImportResultimportWord(@RequestParam("file")MultipartFilefile)throwsIOException{StringBuilderhtmlContent=newStringBuilder();try(InputStreaminputStream=file.getInputStream();XWPFDocumentdocument=newXWPFDocument(inputStream)){for(XWPFParagraphparagraph:document.getParagraphs()){htmlContent.append("");for(XWPFRunrun:paragraph.getRuns()){htmlContent.append("").append(run.getText(0)).append("");}htmlContent.append("");}}returnnewImportResult(htmlContent.toString());}privateStringgetParagraphStyle(XWPFParagraphparagraph){// 这里可以进一步提取段落样式,如对齐方式、行距等return"";}privateStringgetRunStyle(XWPFRunrun){StringBuilderstyle=newStringBuilder();if(run.getFontFamily()!=null){style.append("font-family:").append(run.getFontFamily()).append(";");}if(run.getFontSize()!=-1){style.append("font-size:").append(run.getFontSize()).append("px;");}if(run.getColor()!=null){style.append("color:").append(run.getColor()).append(";");}returnstyle.toString();}}classImportResult{privateStringhtmlContent;publicImportResult(StringhtmlContent){this.htmlContent=htmlContent;}publicStringgetHtmlContent(){returnhtmlContent;}publicvoidsetHtmlContent(StringhtmlContent){this.htmlContent=htmlContent;}}

对于 Excel、PPT 和 PDF 文档,我使用了 Apache POI 的相关模块和 Apache PDFBox 进行解析,将文档内容转换为 HTML 格式并返回给前端,处理逻辑与 Word 文档类似。

四、问题攻坚与解决

(一)图片上传格式错误

在开发过程中,遇到了图片上传后格式错误的问题。经过排查,发现是 base64 数据解码时出现了异常。原因是前端传输的 base64 数据可能包含换行符等特殊字符,导致解码失败。解决方法是在前端传输前对 base64 数据进行清理,去除不必要的字符。

(二)文档样式丢失

在导入文档时,发现部分样式丢失。对于 Word 文档,我调整了 Apache POI 的解析逻辑,尽量提取更多的样式信息。对于其他文档格式,我进一步研究了相关解析库的文档,优化了解析方法,以更好地保留样式。

(三)UEditor 图片替换难题

在前端替换编辑器中的图片链接时,由于 UEditor 内部结构复杂,直接操作 DOM 元素可能会导致编辑器状态异常。我通过研究 UEditor 的 API,找到了合适的方法来替换图片链接,确保编辑器的正常功能。

五、总结与展望

通过这段时间的努力,我已经基本实现了富文本编辑器中粘贴 Word 图片自动上传以及多种文档导入的功能,但在样式保留和稳定性方面还有待提高。在与同行的交流和开发过程中,我积累了宝贵的经验,也认识到了自己的不足之处。

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

复制插件目录

引入插件文件

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转换成图片上传到服务器中。

上传网络图片

下载示例

点击下载完整示例

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

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

相关文章

基于nodejs和vue框架的物业维修服务预约平台thinkphp

目录基于Node.js和Vue框架的物业维修服务预约平台(ThinkPHP摘要)项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作基于Node.js和Vue框架的物业维修服务预约平台(ThinkPHP摘…

Gitee 2026全景解读:为何中国开发者正加速拥抱国产代码托管平台

Gitee 2026全景解读:为何中国开发者正加速拥抱国产代码托管平台 在中国数字化转型浪潮中,代码托管平台已成为开发者不可或缺的基础设施。Gitee作为本土代码托管服务的领军者,正以其独特的本土化优势重构中国开发者的协作生态。最新数据显示&…

系统找不到mfcm120u.dll文件 无法启动怎么修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

高性能计算集群监控数据集:多维度系统资源利用与网络性能分析-科学研究、数据分析、企业应用-CPU使用率、内存占用、磁盘状态、网络延迟、数据包丢失率、网络吞吐量-集群资源优化、性能瓶颈识别、异常检测算法

高性能计算集群监控数据集分析报告 引言与背景 在当今数字化时代,高性能计算集群的稳定运行对于科学研究、数据分析和企业应用至关重要。集群资源的有效监控和管理直接影响系统性能、应用响应时间和整体用户体验。本数据集提供了一个高性能计算集群在25天运行周期…

msvcp90.dll文件丢失找不到 如何修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

系统找不到msvcp110.dll文件 如何修复? 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

如何通过单北斗形变监测提升水库的安全性?

单北斗形变监测技术在水库安全管理中展现出显著作用。通过高精度实时监测,能够及时掌握水库及周边的形变情况,确保可以在隐患发生的初期及时响应。这项技术的核心在于单北斗GNSS系统,具备稳定性和准确性,支持多点同步监测。针对复…

Java 是企业级应用开发的核心语言之一,广泛应用于大型系统、后端服务和分布式架构中

Java 是企业级应用开发的核心语言之一,广泛应用于大型系统、后端服务和分布式架构中。以下是针对“Java(企业级开发核心)”的详细学习路径解析与实战建议:1. 基础语法 变量与数据类型:掌握基本数据类型(int…

C++ 是一门广泛应用于高性能计算、游戏开发、嵌入式系统和底层系统编程的语言

C 是一门广泛应用于高性能计算、游戏开发、嵌入式系统和底层系统编程的语言。其核心优势在于对内存的精细控制和接近硬件的操作能力。以下是围绕你提供的“核心学习路径”进行的详细解析与实战示例。1. 基础语法 变量与数据类型 int a 10; double b 3.14; char c A; bool fl…

LoRA 训练过程详解:从 0 到“懂你”的进化之路

接上文:LoRA 矩阵分解:Rank(秩)与数值的确定机制 “梯度更新”听起来很抽象,我们用一个教大模型写诗的例子,来看看矩阵 A 和 B 是怎么一步步“长脑子”的,也就是它们如何从随机数和零值&#xf…

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤:定义模型、准备数据、选择损失函数和优化器、编写训练循环

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤:定义模型、准备数据、选择损失函数和优化器、编写训练循环。下面以一个简单的线性回归任务为例,演示完整流程。✅ 步骤 1:导入必要的库 import torch import torch.nn as nn import…

协议十年演进

下面给你一条从工程系统、平台化与自治治理视角出发的 「协议十年演进路线(2025–2035)」。 这里的“协议”不只是通信格式,而是系统之间如何理解彼此、约束彼此、协同运行的根本机制。一、核心判断(一句话)未来十年&a…

Go(又称Golang)是一种由Google开发的静态类型、编译型编程语言,设计初衷是解决大规模软件工程中的效率与协作问题

Go(又称Golang)是一种由Google开发的静态类型、编译型编程语言,设计初衷是解决大规模软件工程中的效率与协作问题。其核心优势在于高性能、高并发支持、语法简洁,并具备高效的垃圾回收机制和强大的标准库。 特性与应用场景&#x…

ZYNQ MPSOC VCU介绍

关注、星标公众号,精彩内容每日送达 来源:网络素材1 什么是VCU?VCU 的全称是 Video Codec Unit,即视频编解码单元, Zynq UltraScale MPSoC 系列产品分为三种类型,分别是 CG 型器件、 EG 型器件和 EV 型器件&#xff0…

硬核解析:英伟达机器人的技术内核与落地场景全攻略硬核解析:英伟达机器人的技术内核与落地场景全攻略

2026年CES展会上,英伟达Reachy Mini机器人(酷似“瓦力”)的流畅互动惊艳全场,这背后并非单纯的设计创新,而是其“全栈技术体系多元场景适配”的实力彰显。作为AI与机器人领域的核心玩家,英伟达正通过一套从…

监控十年演进

下面给你一条从工程实践、系统复杂度与自治运维视角出发的 「监控十年演进路线(2025–2035)」。 这里的“监控”不只是看指标,而是系统如何被理解、被约束、被治理。一、核心判断(一句话)未来十年,监控将从…

如何测试生成式AI?ChatGPT类应用的质量保障

生成式AI测试的必要性与挑战 生成式AI(如基于大型语言模型的ChatGPT类应用)正迅速改变人机交互方式,但也带来了前所未有的测试复杂性。与传统软件不同,生成式AI的输出具有高度不确定性、语境依赖性和伦理敏感性。2026年&#xff…

人工智能应用-机器视觉:车牌识别(5)

字符识别 一、分割识别方法 传统方法一般采用“先切割,再识别”的策略,即先对车牌图像进行字符分割,然后将每个字符输入一个分类器进行识别。例如,在下图 3.2.12 中,首先将车牌图片分成“渝”“A”“J”“I”“2”“2…

孤胆枪手下载安装教程(2026 最新版)|下载 + 安装 + 运行配置全流程图文详解

一、前言:为什么现在还需要孤胆枪手下载安装教程 《孤胆枪手(Alien Shooter)》是一款经典的俯视角射击游戏,以极高的爽快度和密集怪物数量著称。 即便发布多年,依然有大量玩家希望在新电脑上重温这款作品。 但在 Win…

人工智能应用-机器视觉:车牌识别(6)

一、端到端序列识别方法 更先进的方法利用循环神经网络(RNN)的序列建模能力,不需要对字符进行逐一切割,而是对车牌图像中的字符串做整体识别。如下图 24.14所示:首先利用卷积神经网络(CNN)对输入…