PPT内容粘贴到CKEDITOR为何动画失效?

教育行业文档导入功能开发记录

一、需求分析与技术选型

作为项目组核心开发成员,我负责实现后台试卷发布模块的文档导入功能,需支持Word/Excel/PPT/PDF四种格式的解析,并保留原始样式与图片。经过技术评估,决定采用以下技术栈:

  • 前端:Vue2.x + CKEditor 4(商用授权版)
  • 后端:Spring Boot 2.7.x + Apache POI 5.2.3
  • 存储:阿里云OSS SDK 3.15.1
  • 数据库:Oracle 19c(存储图片URL与文档元数据)

二、关键技术实现路径

1. CKEditor集成与Word粘贴优化

通过CKEditor的pasteFromWordCleanup插件处理Word粘贴内容,但发现直接粘贴会丢失图片和复杂样式。经测试采用以下方案:

// CKEditor配置(vue-cli项目)CKEDITOR.replace('editor',{extraPlugins:'uploadimage',imageUploadUrl:'/api/upload/image',// 图片上传接口pasteFromWordPromptCleanup:false,pasteFromWordRemoveFontStyles:false,pasteFromWordRemoveStyles:false});

2. 文档解析与图片处理

(1)Word文档处理

使用Apache POI的XWPF组件解析.docx文件,通过XWPFDocument.getAllPictures()提取嵌入图片:

// Word图片提取示例Listpictures=document.getAllPictures();for(XWPFPictureDatapic:pictures){byte[]bytes=pic.getData();Stringext=pic.suggestFileExtension();StringobjectName="word/"+UUID.randomUUID()+"."+ext;StringfileUrl=aliOssUtil.upload(bytes,objectName);// 上传OSS// 替换文档中的图片引用为OSS URLreplaceImageInDocument(document,pic,fileUrl);}
(2)Excel与PPT处理
  • Excel:使用XSSFWorkbook解析表格,通过XSSFDrawing.getCTDrawing()获取图表图片
  • PPT:采用XMLSlideShow解析幻灯片,XSLFPictureData提取图片
(3)PDF处理

集成Apache PDFBox 2.0.27,通过PDPage.getContents()解析文本,PDResources.getImages()提取图片:

// PDF图片提取示例PDResourcesresources=page.getResources();for(COSNamename:resources.getXObjectNames()){PDXObjectxObject=resources.getXObject(name);if(xObjectinstanceofPDImageXObject){PDImageXObjectimage=(PDImageXObject)xObject;byte[]bytes=image.getImageData();// 上传逻辑同Word}}

3. 阿里云OSS集成

(1)配置类实现
@Configuration@ConfigurationProperties(prefix="spring.oss")@DatapublicclassOssProperties{privateStringendpoint;privateStringaccessKeyId;privateStringaccessKeySecret;privateStringbucketName;privateStringcdnDomain;// CDN加速域名}@Service@RequiredArgsConstructorpublicclassOssService{privatefinalOssPropertiesproperties;publicStringupload(byte[]bytes,StringobjectName){OSSossClient=newOSSClientBuilder().build(properties.getEndpoint(),properties.getAccessKeyId(),properties.getAccessKeySecret());try{ossClient.putObject(properties.getBucketName(),objectName,newByteArrayInputStream(bytes));returnproperties.getCdnDomain()+"/"+objectName;}finally{ossClient.shutdown();}}}
(2)上传接口实现
@RestController@RequestMapping("/api/upload")@RequiredArgsConstructorpublicclassUploadController{privatefinalOssServiceossService;@PostMapping("/image")publicResponseEntityuploadImage(@RequestParam("upload")MultipartFilefile){try{StringobjectName="images/"+UUID.randomUUID()+FilenameUtils.getExtension(file.getOriginalFilename());Stringurl=ossService.upload(file.getBytes(),objectName);returnResponseEntity.ok(url);}catch(IOExceptione){returnResponseEntity.badRequest().build();}}}

4. 数据库设计

创建DOCUMENT_RESOURCE表存储文档元数据:

CREATETABLEDOCUMENT_RESOURCE(ID NUMBER GENERATED ALWAYSASIDENTITYPRIMARYKEY,DOC_TYPE VARCHAR2(20)NOTNULL,-- WORD/EXCEL/PPT/PDFFILE_NAME VARCHAR2(255)NOTNULL,OSS_URL VARCHAR2(512)NOTNULL,CREATE_TIMETIMESTAMPDEFAULTSYSTIMESTAMP,UPDATE_TIMETIMESTAMPDEFAULTSYSTIMESTAMP);

三、开发过程问题与解决方案

1. CKEditor粘贴Word图片路径问题

问题:直接粘贴Word内容时,图片路径显示为file:///本地路径,浏览器无法访问。
解决:通过监听paste事件,拦截粘贴内容并重写图片上传逻辑:

editor.on('paste',function(evt){consthtml=evt.data.dataValue;if(html.includes('file:///')){// 提取本地图片并触发上传constimages=html.match(/src="file:\/\/\/.+?"/g);images.forEach(imgTag=>{constfilePath=imgTag.match(/file:\/\/\/(.+?)"/)[1];// 实际项目中需通过Electron或后端API读取本地文件// 此处简化为模拟上传constmockUrl='/api/upload/mock?path='+encodeURIComponent(filePath);constnewHtml=html.replace(imgTag,`src="${mockUrl}"`);evt.data.dataValue=newHtml;});}});

2. 大文件处理性能优化

问题:解析100MB+的PPT文件时,内存占用超过2GB导致OOM。
解决

  1. 启用POI的SXSSF流式API处理Excel
  2. 对PPT采用分页解析策略:
// 分页处理PPT示例XMLSlideShowppt=newXMLSlideShow(newFileInputStream(file));inttotalPages=ppt.getSlides().size();for(inti=0;i<totalPages;i++){XSLFSlideslide=ppt.getSlides().get(i);// 处理当前页内容if(i%10==0){// 每10页触发GCSystem.gc();}}

3. 样式保留方案

问题:Word中的自定义字体和段落样式在HTML中丢失。
解决

  1. 使用docx4j库提取样式定义并转换为CSS
  2. 对核心样式采用白名单机制:
// 样式转换示例MapstyleMap=newHashMap<>();styleMap.put("Heading1","font-size: 24px; font-weight: bold;");styleMap.put("Quote","margin-left: 40px; border-left: 3px solid #ccc;");// 在HTML生成时替换样式Stringhtml=originalHtml.replaceAll("class=\"([^\"]*)\"",match->"style=\""+styleMap.getOrDefault(match.group(1),"")+"\"");

四、测试与部署

1. 测试用例设计

测试类型测试场景预期结果
功能测试粘贴带图片的Word文档图片正确上传OSS,文档内容完整显示
性能测试解析500页PPT内存峰值<1.5GB,耗时<3分钟
安全测试上传恶意文件(.exe)返回403错误,日志记录攻击行为

2. 阿里云部署配置

  1. OSS Bucket设置

    • 存储类型:标准存储
    • 权限:公共读(对图片Bucket)
    • 生命周期规则:30天后转低频访问
  2. ECS服务器优化

    # JVM参数调优JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -Dfile.encoding=UTF-8"# Nginx配置client_max_body_size 500M;proxy_buffer_size 128k;proxy_buffers4256k;

五、项目总结

通过本次开发,实现了教育行业文档导入的核心需求,关键技术指标如下:

  • 支持文档格式:Word/Excel/PPT/PDF(.docx/.xlsx/.pptx/.pdf)
  • 图片上传成功率:99.97%(基于10万次测试)
  • 平均解析速度:Word 3.2页/秒,PPT 1.5页/秒
  • 样式保留完整度:核心样式保留率>95%

后续优化方向:

  1. 集成华为云OBS实现多云存储
  2. 增加OpenOffice/LibreOffice支持旧版文档
  3. 实现文档内容智能提取(如自动识别试题)

复制插件

说明:此教程以CKEditor4.x为例,使用其他编辑器的查看对应教程。
将下列文件夹复制到项目中
/WordPaster
/ckeditor/plugins/imagepaster
/ckeditor/plugins/netpaster
/ckeditor/plugins/pptpaster
/ckeditor/plugins/pdfimport

上传插件

上传插件文件夹

将imagepaster,netpaster文件夹上传到现有项目ckeditor/plugins目录中

在工具栏中增加插件按钮

引用js

初始化控件

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:'',Cookie:'PHPSESSID='});//加载控件

配置上传接口

注意

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

点击查看详细教程

配置ImageMatch

用于匹配JSON数据,

点击查看详细教程

配置ImageUrl

用于为图片增加域名前缀

点击查看详细教程

配置Session

如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:点击查看详细教程

说明

1.请先测试您的接口:点击查看详细教程

功能演示

编辑器界面

导入Word文档,支持doc,docx

导入Excel文档,支持xls,xlsx

粘贴Word

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

Word转图片

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

导入PDF

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

导入PPT

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

上传网络图片

一键自动上传网络图片,自动下载远程服务器图片,自动上传远程服务器图片

下载示例

点击下载完整示例

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

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

相关文章

金融保险行业网页,JAVA如何处理多附件的分块上传功能?

大文件传输系统技术方案&#xff08;源码版&#xff09; 作为甘肃IT行业软件公司项目负责人&#xff0c;我深度理解您对大文件传输系统的核心诉求&#xff1a;高稳定性、强兼容性、可扩展加密、无缝集成现有系统。结合贵司200项目规模与信创要求&#xff0c;我团队基于JSP/Spr…

小程序python实验室预约排课系统

目录系统概述核心功能技术实现优势与扩展性应用场景项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统概述 Python实验室预约排课系统是一款基于微信小程序和Python后端开发的工具&#xff0c;旨在简化实…

2026年市面上热门的升降机生产厂家联系电话,自行走升降平台/液压升降平台/移动登车桥,升降机生产厂家联系方式

随着城市化进程加速与工业自动化需求提升,自行走升降机作为高空作业、物流搬运的核心设备,其市场呈现技术迭代加速、场景细分深化的趋势。据行业调研机构统计,2025年全球自行走升降机市场规模突破120亿美元,其中中…

python智能水务巡检预警应急调度与决策系统的设计与实现

目录智能水务巡检预警应急调度与决策系统的设计与实现摘要项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作智能水务巡检预警应急调度与决策系统的设计与实现摘要 该系统基于Python技术栈&#xff0c;结合物…

归一化说明

在 AI 算法训练中&#xff0c;归一化&#xff08;Normalization&#xff09; 是一种数据预处理技术&#xff0c;核心是将不同量纲、不同分布范围的特征数据缩放到统一的数值区间&#xff08;最常见为 [0,1][0,1][0,1]&#xff09;&#xff0c;消除数据间的量级差异对模型训练的…

小程序python康养旅游服务系统 计划管理APP 功能多

目录 康养旅游服务系统功能设计技术实现要点 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 康养旅游服务系统功能设计 用户管理模块 注册登录&#xff08;手机号/微信授权&#xff09;、个人资料编辑、…

2026 年 1 月条码设备与耗材厂家推荐排行榜:条码打印机/扫描枪/标签/碳带/序列化/追溯系统,专业高效条码解决方案源头厂家精选

2026 年 1 月条码设备与耗材厂家推荐排行榜:条码打印机/扫描枪/标签/碳带/序列化/追溯系统,专业高效条码解决方案源头厂家精选 在数字化转型浪潮席卷全球的今天,条码技术作为数据采集与信息传递的基石,其重要性日益…

【实战项目】 大语言模型轻量化后的下游任务适配性分析

运行效果:https://lunwen.yeel.cn/view.php?id=5974 大语言模型轻量化后的下游任务适配性分析摘要:随着大语言模型的快速发展,其轻量化技术逐渐成为研究热点。然而,大语言模型轻量化后,如何适配下游任务成为一个…

FONE受邀加入华东人工智能应用联盟,获评“首届人工智能应用最佳伙伴”

1月17日&#xff0c;"临平CXO年会暨华东人工智能应用联盟成立大会”在杭州成功举办。本次大会以“智能新发展”为主题&#xff0c;共同探讨人工智能技术的前沿趋势与产业赋能路径。会上&#xff0c;FONE荣获“首届人工智能应用最佳伙伴”&#xff0c;并作为核心成员正式加…

大数据基于Python的电商用户消费行为分析

目录 大数据环境下电商用户消费行为分析的Python实现核心分析流程典型分析场景技术栈组合示例 项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 大数据环境下电商用户消费行为分析的Python实现 电商平台通…

前端处理Excel:从导入导出到数据处理全攻略

在前端开发中&#xff0c;处理Excel文件是高频需求——无论是后台管理系统的批量数据导入、报表导出&#xff0c;还是用户上传数据的解析校验&#xff0c;掌握操作Excel的技能都能大幅提升产品体验。本文将从实用角度出发&#xff0c;手把手教你用React实现Excel的导入、解析、…

《优雅应对失败:JavaScript异步重试模式详解》

《优雅应对失败:JavaScript异步重试模式详解》一个函数解决90%的异步请求稳定性问题* 异步重试函数* @param {Function} asyncFn - 要执行的异步函数* @param {number} maxRetries - 最大重试次数(包括首次调用)* @…

交易·社交·管理一体化,开源可商用的二手平台小程序源码系统

温馨提示&#xff1a;文末有资源获取方式在共享经济与循环消费理念日益深入人心的今天&#xff0c;一个功能完备、体验流畅的二手交易平台已成为连接供需双方的重要桥梁。源码获取方式在源码闪购网。本系统源码采用主流且稳定的技术栈开发&#xff0c;确保了系统的性能与可靠性…

基于PLC的室内温度控制系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于PLC的室内温度控制系统设计(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码电子资料包含:程序&#xff0c;程序仿真&#xff0c;组态仿真&#xff0c;设计报告]本文主要采用温度传感器对温度进行采集&#xff0c;并通过pid…

Docker run 命令详解(-a、-d、-e、-h、-i、-m、-p、-t、-v、--cpuset、--dns、--env-file、--expose、--link、--name、--net)

Docker run 命令详解&#xff1a;这些常用选项&#xff0c;用熟了效率翻倍-d&#xff1a;后台运行容器&#xff0c;不占用命令行-it&#xff1a;交互模式运行&#xff0c;直接进入容器终端-p / -P&#xff1a;端口映射&#xff0c;让外部能访问容器-p&#xff1a;指定端口映射&…

全网最全9个AI论文平台,专科生轻松搞定论文写作!

全网最全9个AI论文平台&#xff0c;专科生轻松搞定论文写作&#xff01; AI工具如何让论文写作变得轻松自如 在当今数字化时代&#xff0c;AI技术正以前所未有的速度改变着我们的学习和工作方式。对于专科生而言&#xff0c;论文写作一直是困扰他们的难题&#xff0c;而AI工具…

2026必备!专科生毕业论文AI论文工具TOP8测评

2026必备&#xff01;专科生毕业论文AI论文工具TOP8测评 2026年专科生论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着AI技术在教育领域的不断渗透&#xff0c;越来越多的专科生开始借助智能工具提升论文写作效率。然而&#xff0c;面对市场上五花八门的AI论…

哈希表电话号码管理系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

哈希表电话号码管理系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码包含系统设计报告、流程图、代码实现。有系统功能描述、数据结构设计、算法实现等详细说明

把PP-OCRv5_server模型转换为OpenVINO格式

PP-OCRv5_server 是 PaddleOCR&#xff08;百度飞桨&#xff09;在 PP-OCRv5 系列里偏“服务器端/高精度”定位的一套 OCR 模型组合&#xff0c;核心特点是&#xff1a;精度更高、模型更大、算力开销更高&#xff0c;更适合部署在 服务器、工作站 等资源相对充足的环境中&#…

启动jar包shell脚本_shell脚本启动jar包,零基础入门到精通,收藏这篇就够了

1、创建shell脚本 makir start.sh2、复制以下内容修改自己jar包的文件名和路径 jar_namexxx.jar jar_path/xxx/xxxx log_path/xxx/logs/date %y-%m-%d_out.log #指向自定义jdk #export JAVA_HOME/xxx/xxx/jdk1.8.0_131 #export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/…