news 2026/6/13 18:34:54

ckeditor讨论IE中word图片粘贴转存实现方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ckeditor讨论IE中word图片粘贴转存实现方法

PHP程序员的逆袭:680元搞定CMS编辑器神级插件!

(敲黑板)各位西安的码农兄弟们注意啦!今天给大家分享一个我最近在做的"骚操作"——用680元预算搞定了客户提出的"编辑器神级需求",现在连我二舅这种只会用Word的老古董都能在CMS后台愉快地发新闻了!

一、客户需求有多野?

客户爸爸的需求堪称"编辑器界的灭霸":

  1. 支持Word/Excel/PPT/PDF一键导入(要保留样式、图片、公式)
  2. 支持微信公众号内容无损复制
  3. LaTeX公式自动转MathML(多端高清显示)
  4. 图片自动上传OSS(公有云/私有云/混合云都支持)
  5. 必须做成CKEditor插件(不能动现有代码)
  6. 预算不超过680元(还不够吃顿海底捞)

(拍大腿)最绝的是,客户说:“小张啊,我们单位55岁的王主任也要用,你搞复杂了他该骂我了!”

二、技术选型:白嫖大法好

经过三天三夜(实际是摸鱼三天)的调研,我决定采用以下"白嫖"方案:

前端部分(Vue3 + CKEditor5)

// src/plugins/OfficeImporter/OfficeImporterPlugin.jsimportPluginfrom'@ckeditor/ckeditor5-core/src/plugin';importButtonViewfrom'@ckeditor/ckeditor5-ui/src/button/buttonview';importofficeIconfrom'./office.svg';exportdefaultclassOfficeImporterextendsPlugin{init(){consteditor=this.editor;editor.ui.componentFactory.add('officeImporter',locale=>{constbutton=newButtonView(locale);button.set({label:'导入Office文档',icon:officeIcon,tooltip:true});button.on('execute',()=>{// 调用后端APIconstfileInput=document.createElement('input');fileInput.type='file';fileInput.accept='.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf';fileInput.onchange=async(e)=>{constfile=e.target.files[0];constformData=newFormData();formData.append('file',file);try{constresponse=awaitfetch('/api/office/import',{method:'POST',body:formData});constresult=awaitresponse.json();// 插入HTML到编辑器editor.model.change(writer=>{constviewFragment=editor.data.toView(result.html);constmodelFragment=editor.data.toModel(viewFragment);writer.insert(modelFragment,editor.model.document.getRoot());});}catch(error){console.error('导入失败:',error);}};fileInput.click();});returnbutton;});}}

后端部分(PHP + Mammoth.js + Apache POI)

// api/office/import.php'没有上传文件']);exit;}$file=$_FILES['file'];$allowedTypes=['docx','xlsx','pptx','pdf'];$ext=strtolower(pathinfo($file['name'],PATHINFO_EXTENSION));if(!in_array($ext,$allowedTypes)){http_response_code(400);echojson_encode(['error'=>'不支持的文件类型']);exit;}// 临时保存文件$tmpPath=sys_get_temp_dir().'/'.uniqid().'.'.$ext;move_uploaded_file($file['tmp_name'],$tmpPath);// 处理不同类型文件$html='';switch($ext){case'docx':// 使用Mammoth.js的PHP封装(实际需要自己实现或找替代方案)$html=convertDocxToHtml($tmpPath);break;case'xlsx':$html=convertExcelToHtml($tmpPath);break;case'pptx':$html=convertPptToHtml($tmpPath);break;case'pdf':$html=convertPdfToHtml($tmpPath);break;}// 处理图片上传到OSS$html=uploadImagesToOss($html);// 处理LaTeX公式(简单正则替换,实际需要更复杂的解析)$html=preg_replace_callback('/\\\(.*?)\\\/',function($matches){// 这里应该调用LaTeX解析服务,简化演示return''.htmlspecialchars($matches[1]).'';},$html);unlink($tmpPath);echojson_encode(['success'=>true,'html'=>$html]);functionuploadImagesToOss($html){$ossClient=newS3Client([...]);// 阿里云OSS配置// 使用DOMDocument解析HTML$dom=newDOMDocument();@$dom->loadHTML($html,LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);$images=$dom->getElementsByTagName('img');foreach($imagesas$img){if(strpos($img->getAttribute('src'),'data:image')===0){// 处理base64图片$imageData=base64_decode(preg_replace('#^data:image/\w+;base64,#i','',$img->getAttribute('src')));$key='uploads/'.uniqid().'.png';// 上传到OSS$ossClient->putObject(['Bucket'=>'your-bucket','Key'=>$key,'Body'=>$imageData,'ACL'=>'public-read']);$img->setAttribute('src','https://your-bucket.oss-cn-hangzhou.aliyuncs.com/'.$key);}}return$dom->saveHTML();}

三、实现过程中的骚操作

  1. 白嫖开源库

    • 用Mammoth.js处理Word文档(通过PHP调用Node.js服务)
    • 用Apache POI处理Excel(通过Java中间服务)
    • 用LibreOffice转换PDF/PPT(通过命令行调用)
  2. 曲线救国方案

    • 发现完全支持所有需求的开源方案不存在后,决定组合多个工具
    • 用Python写了个中间服务处理复杂格式(运行在Docker里)
    • 最终用PHP做胶水语言粘合所有服务
  3. 成本控制绝招

    • 阿里云ECS用学生机(1核2G只要9.9元/月)
    • OSS用低频访问类型(存储成本直降70%)
    • 所有服务跑在同一个服务器上(省了负载均衡费用)

四、最终效果

现在客户爸爸的55岁王主任可以:

  1. 点击编辑器上的"Office导入"按钮
  2. 选择他的"年度工作总结.docx"
  3. 3秒后看到完全保留格式的文档出现在编辑器中
  4. 连他手绘的流程图(用Word画的)都完美保留了!

(得意地笑)最关键的是,整个项目成本:

  • 阿里云ECS:68元/月(学生优惠)
  • OSS存储:免费额度够用
  • 我的开发时间:0元(因为是在公司摸鱼做的)

五、加入我们的赚钱大军!

现在这个插件已经在我QQ群(223813913)里免费分享了!加入群还能:

  1. 领1-99元随机红包(我自掏腰包)
  2. 接我的外包项目分包(我抽10%管理费)
  3. 推荐客户拿20%提成(躺着赚钱)

(突然严肃)说真的,现在经济形势不好,咱们程序员更要抱团取暖。我这个方案已经帮3个客户节省了上万元开发费,现在他们主动给我介绍新客户。上个月我靠推荐提成就赚了4000多,比写代码还轻松!

(最后喊一句)西安的兄弟们,是时候展现真正的技术了!加入QQ群223813913,让我们一起用技术赚钱,用代码改变生活!

复制插件

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

上传插件

上传插件文件夹

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

在工具栏中增加插件按钮

CKEDITOR.replace('editor1',{extraPlugins:'zycapture,imagepaster,importwordtoimg,netpaster,wordimport,excelimport,pptimport,pdfimport,importword,exportword,importpdf',keystrokes:[[CKEDITOR.CTRL+86/*V*/,'imagepaster']],on:{currentInstance:function(){//多个编辑器时为控件设置当前编辑器WordPaster.getInstance().SetEditor(CKEDITOR.currentInstance);window.zyCapture.setEditor(this);window.zyOffice.SetEditor(this);}},//https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContentallowedContent:true//不过滤样式});

引用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='});//加载控件

配置上传接口

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:'<%=clientCookie%>',event:{dataReady:function(e){//e.word,//e.imgs:tag1,tag2,tag3console.log(e.imgs)}}});//加载控件

注意

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

上传网络图片

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

下载示例

点击下载完整示例

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

html5大文件分片上传插件开源代码与商业解决方案对比

大文件上传方案设计与实现&#xff08;政府信创环境兼容&#xff09; 方案背景 作为北京某软件公司的开发人员&#xff0c;我负责为政府客户实现一个兼容主流浏览器和信创国产化环境的大文件上传系统。当前需求是支持4GB左右文件的上传&#xff0c;后端使用PHP&#xff0c;前…

作者头像 李华
网站建设 2026/6/10 11:43:46

掌握Open-AutoGLM工作原理的7个关键技术点,构建你自己的AI助手

第一章&#xff1a;Open-AutoGLM操作手机app的原理Open-AutoGLM 是一种基于大语言模型&#xff08;LLM&#xff09;与自动化执行框架融合的技术方案&#xff0c;能够通过自然语言指令驱动移动端应用程序的自动操作。其核心在于将用户输入的语义指令解析为可执行的操作序列&…

作者头像 李华
网站建设 2026/6/13 14:23:15

PaddlePaddle智能制造预测性维护系统

PaddlePaddle智能制造预测性维护系统 在现代工厂的轰鸣声中&#xff0c;一台电机突然停转——这不是因为零件断裂&#xff0c;而是系统在它“生病”前就主动切断了电源。这样的场景&#xff0c;正在越来越多的智能工厂上演。设备不再等到故障才维修&#xff0c;而是通过传感器…

作者头像 李华
网站建设 2026/6/10 18:59:24

Open-AutoGLM能装电脑上吗?一文看懂硬件门槛与性能实测数据

第一章&#xff1a;Open-AutoGLM能装电脑上吗Open-AutoGLM 是一个基于 AutoGLM 架构的开源语言模型项目&#xff0c;旨在提供轻量化、可本地部署的自然语言处理能力。该模型设计之初就考虑了本地运行的需求&#xff0c;因此支持在个人计算机上部署和运行&#xff0c;尤其适用于…

作者头像 李华
网站建设 2026/6/13 5:51:01

46、网站IP与域名管理全攻略

网站IP与域名管理全攻略 1. 修复脏IP及“不良邻居”问题 了解并监控网站的IP地址,确保其保持“干净”是很有必要的。这就如同租公寓,刚搬进去时周边环境安静祥和,但不代表日后不会变差。 IP地址分为虚拟IP和专用IP两种。虚拟IP意味着多个网站(服务器允许的最大数量)共用…

作者头像 李华
网站建设 2026/6/12 0:07:32

PaddlePaddle点云处理PointNet实战:LiDAR数据分析

PaddlePaddle点云处理PointNet实战&#xff1a;LiDAR数据分析 在自动驾驶系统中&#xff0c;如何让车辆“看清”周围环境&#xff1f;摄像头、毫米波雷达固然重要&#xff0c;但真正赋予车辆三维空间感知能力的&#xff0c;是激光雷达&#xff08;LiDAR&#xff09;。它每秒发射…

作者头像 李华