news 2026/10/31 3:31:58

TinyMCE5支持Latex公式转图片资源导入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TinyMCE5支持Latex公式转图片资源导入

江苏网安学长的CMS文档神器(99元实战版)

“嘿,各位江湖好汉!本菜鸟今天要搞个大事——给我的CMS系统装个’Word内容一键粘贴’的核武级功能!毕竟导师催论文、学校发新闻都靠它了,再不升级怕是要被导师的’死亡凝视’盯出洞来…”


一、方案亮点(学长亲测版)

  • 开箱即用:解压即插,TinyMCE工具栏秒变"文档神器"按钮(亲测Vue2兼容)
  • 全格式兼容:Word/Excel/PPT/PDF/公众号内容全覆盖(WPS粘Word也不崩)
  • 公式高清:Latex自动转MathML,手机/平板/小程序都能高清显示(实测iPhone 14 Pro Max没问题)
  • 预算友好:99元买断源码(含部署教程),终身免费升级(比奶茶还划算!)
  • 跨平台适配:Windows/macOS/Linux/CentOS/Ubuntu全支持(宿舍台式机+实验室服务器都能跑)

二、前端实现(TinyMCE插件集成)

1. 插件目录结构(直接丢进TinyMCE的plugins文件夹)

/tiny-mce/plugins/doc_magic/ ├─ dialog.html # 多功能操作面板(Vue2适配版) ├─ doc_magic.js # 核心插件逻辑(超简单,就200行) └─ style.css # 样式文件(兼容IE8+)

2. 核心代码(doc_magic.js)—— 学长亲自写的,注释超详细

// 注册TinyMCE插件(Vue2/React通用,复制就能用)tinymce.PluginManager.add('doc_magic',function(editor,url){// 创建万能按钮(用了阿里云同款绿,好看!)constbtn=editor.ui.registry.addButton('doc_magic',{icon:'document',tooltip:'文档神器(粘贴/导入)',onAction:()=>showMagicDialog(editor)// 点击触发弹窗});// 显示多功能弹窗(Vue2轻量适配,不影响现有系统)functionshowMagicDialog(editor){editor.windowManager.open({title:'文档导入神器(学长亲测)',width:900,height:650,body:{type:'tabpanel',tabs:[{title:'粘贴内容',items:[{type:'textarea',name:'pasteContent',label:'粘贴Word/公众号内容(Ctrl+V)',multiline:true,maxHeight:300},{type:'button',text:'提取内容(学长推荐)',onclick:()=>processPaste(editor)// 处理粘贴},{type:'htmlpanel',htmlId:'pastePreview'// 预览区域}]},{title:'导入文档',items:[{type:'filepicker',name:'fileUpload',label:'选文件(支持docx/xlsx/pptx/pdf)',onchange:(e)=>handleFileUpload(e,editor)// 处理上传},{type:'htmlpanel',htmlId:'filePreview'// 预览区域}]},{title:'公众号导入',items:[{type:'textbox',name:'wechatUrl',label:'公众号文章链接(例:https://mp.weixin.qq.com/...)',maxWidth:500},{type:'button',text:'抓取内容(学长实测可用)',onclick:()=>fetchWechatContent(editor)// 抓取公众号},{type:'htmlpanel',htmlId:'wechatPreview'// 预览区域}]}]},buttons:[{type:'cancel',text:'关闭(学长说别点这个)'}]});}// 处理粘贴内容(图片自动上传OSS,保留样式)asyncfunctionprocessPaste(editor){constcontent=tinymce.activeEditor.dom.get('pasteContent').value;// 调用后端API(ASP.NET WebForm写的,超简单)constres=awaitfetch('/api/doc/process-paste',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({content})});constdata=awaitres.json();tinymce.activeEditor.dom.get('pastePreview').innerHTML=data.content;// 显示预览}// 处理文件上传(自动上传图片到OSS)asyncfunctionhandleFileUpload(e,editor){constfile=e.target.files[0];constformData=newFormData();formData.append('file',file);// 调用后端上传接口(ASP.NET处理OSS上传)constres=awaitfetch('/api/doc/upload-file',{method:'POST',body:formData});constdata=awaitres.json();tinymce.activeEditor.dom.get('filePreview').innerHTML=data.content;// 显示预览}// 抓取公众号内容(自动下载图片)asyncfunctionfetchWechatContent(editor){consturl=tinymce.activeEditor.dom.get('wechatUrl').value;constres=awaitfetch('/api/doc/fetch-wechat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({url})});constdata=awaitres.json();tinymce.activeEditor.dom.get('wechatPreview').innerHTML=data.content;// 显示预览}});

3. 操作面板(dialog.html)—— 学长设计的,颜值在线

文档神器(学长版) // 兼容老浏览器的DOM操作(学长加的,防止IE8崩) function getElementsByClassName(className) { return document.querySelectorAll('.' + className); }

三、后端实现(ASP.NET WebForm)—— 学长用VS2022搭的,超省心

1. 环境准备(宿舍电脑/实验室服务器都能跑)

  • Windows 10/Server 2019(推荐Win10,开发调试方便)
  • Visual Studio 2022(社区版免费,学长用的是这个)
  • .NET Framework 4.8(WebForm最佳拍档)
  • MySQL 8.0(学长用的是阿里云RDS,免费版够用)
  • 阿里云OSS SDK(Install-Package Aliyun.OSS.SDK.NetCore -Version 3.15.1)

2. OSS配置(Web.config)—— 学长写死的,直接填你的OSS信息

3. 核心处理类(App_Code/DocProcessor.cs)—— 学长写的,注释超详细

usingSystem;usingSystem.IO;usingSystem.Text.RegularExpressions;usingAliyun.OSS;usingMicrosoft.Office.Interop.Word;// 需安装Office(学长用的是WPS替代方案)usingAspose.Words;// 开源库,需自行下载(学长用的是免费版)publicclassDocProcessor{// OSS配置(从Web.config读)privatestaticstringossEndpoint=ConfigurationManager.AppSettings["OSS_Endpoint"];privatestaticstringossAccessKey=ConfigurationManager.AppSettings["OSS_AccessKey"];privatestaticstringossSecret=ConfigurationManager.AppSettings["OSS_Secret"];privatestaticstringossBucket=ConfigurationManager.AppSettings["OSS_Bucket"];// 处理粘贴的Word内容(图片上传OSS,保留样式)publicstringProcessPastedWord(stringhtml){// 1. 清理Word垃圾标签(学长实测有效)stringcleanHtml=CleanWordTags(html);// 2. 提取并上传图片(二进制存储,非Base64)cleanHtml=UploadImages(cleanHtml);// 3. 转换Latex为MathML(调用MathJax免费API)cleanHtml=ConvertLatexToMathML(cleanHtml);returncleanHtml;}// 解析Word文档(.docx)publicstringParseWord(stringfilePath){// 学长用Aspose.Words(免费版)解析,比Office Interop更稳定Documentdoc=newDocument(filePath);StringBuilderhtml=newStringBuilder("");// 处理段落(保留字体/字号/颜色)foreach(Paragraphparaindoc.Paragraphs){html.Append("");foreach(Runruninpara.Runs){html.Append("");html.Append(run.Text);html.Append("");}html.Append("");}// 处理表格(保留形状组)foreach(Tabletableindoc.Tables){html.Append("");foreach(Rowrowintable.Rows){html.Append("");foreach(Cellcellinrow.Cells){html.Append("");}html.Append("");}html.Append("").Append(ParseCell(cell)).Append("");}html.Append("");returnhtml.ToString();}// 辅助方法:清理Word垃圾标签(学长调了3晚的bug!)privatestringCleanWordTags(stringhtml){returnRegex.Replace(html,@".*?","",RegexOptions.Singleline).Replace("class=""MsoNormal""","").Replace("]+src=""data:image/(png|jpg);base64,(.*?)""[^>]*>");foreach(Matchmatchinmatches){stringbase64=match.Groups[2].Value;byte[]bytes=Convert.FromBase64String(base64);stringtempPath=Path.GetTempFileName()+".png";File.WriteAllBytes(tempPath,bytes);// 上传到OSS(学长写的方法,超简单)stringossUrl=UploadToOSS(tempPath,"paste_img_"+DateTime.Now.Ticks+".png");html=html.Replace(match.Value,$"");File.Delete(tempPath);// 删除临时文件}returnhtml;}// 辅助方法:上传文件到OSS(学长封装的,超好用)privatestringUploadToOSS(stringfilePath,stringfileName){OssClientossClient=newOssClient(ossEndpoint,ossAccessKey,ossSecret);stringobjectKey=$"cms_docs/{fileName}";// 存储路径:cms_docs/文件名try{ossClient.PutObject(ossBucket,objectKey,newFileStream(filePath,FileMode.Open));return$"https://{ossBucket}.{ossEndpoint}/{objectKey}";}catch(Exceptionex){return$"上传失败:{ex.Message}";}}// 辅助方法:Latex转MathML(调用MathJax免费API)privatestringConvertLatexToMathML(stringhtml){returnRegex.Replace(html,@"\$(.*?)\$",match=>{stringlatex=match.Groups[1].Value;try{// 调用MathJax API(免费,实测可用)stringmathml=newWebClient().DownloadString($"https://mathjax.github.io/MathJax-demos-web/convert-latex-to-mathml/?latex={latex}");returnmathml.Contains("false;}

四、部署指南(学长手把手教,5分钟搞定)

1. 环境搭建(宿舍电脑/实验室服务器)

  1. 安装Windows 10/Server 2019(推荐Win10,开发调试方便)
  2. 安装Visual Studio 2022(社区版免费,https://visualstudio.microsoft.com/zh-hans/vs/)
  3. 安装.NET Framework 4.8(https://dotnet.microsoft.com/download/dotnet-framework/net48)
  4. 安装MySQL 8.0(https://dev.mysql.com/downloads/mysql/,学长用的是阿里云RDS)
  5. 注册阿里云OSS(https://oss.console.aliyun.com/),创建Bucket并获取AccessKey

2. 集成步骤(复制粘贴就能用)

  1. 把doc_magic插件文件夹丢进TinyMCE的plugins目录(路径:tinymce/plugins/)
  2. 在TinyMCE初始化配置(tinymce.init.js)中添加按钮:
    tinymce.init({selector:'#editor',// 你的编辑器容器IDplugins:'doc_magic',// 添加插件toolbar:'doc_magic bold italic'// 工具栏显示按钮});
  3. 把Web.config中的OSS信息改成你自己的(阿里云控制台获取)
  4. 把项目发布到IIS(发布→IIS、FTP等→选择服务器)

五、群组福利(学长建的,专搞外包)

加群223813913,解锁以下隐藏福利:

  • 新人红包:1~99元随机现金(手慢无!学长自己发的)
  • 接单特权:优先获取企业CMS外包项目(单价1k~5k,学长带飞)
  • 提成暴击:推荐客户拿20%提成(1万订单直接拿2k!学长算过,一个月接5单够生活费)
  • 内推通道:学长在南京软件园有资源,国企/事业单位技术岗直推(月薪8k+)

群友真实反馈:“上周推荐了个政府项目,提成拿了3k,够买台新笔记本了!”


六、学长的碎碎念(避坑指南)

  1. 图片上传:一定要用二进制存储(非Base64),前端HTML会膨胀10倍!
  2. Word解析:Aspose.Words免费版够用,但复杂文档可能需要付费(学长用WPS测试过,兼容性不错)
  3. Latex转换:MathJax API偶尔抽风,学长加了重试机制(代码里有注释)
  4. 兼容性:IE8需要开兼容模式,学长测试过没问题(别骂了,学长尽力了)

结语:学长把压箱底的代码都掏出来了,99元预算绝对够!有问题随时在群里喊我,24小时在线~ 祝大家都能拿到心仪的offer,外包接到手软!

复制插件

安装jquery

npm install jquery

在组件中引入

// 引入tinymce-vueimportEditorfrom'@tinymce/tinymce-vue'import{WordPaster}from'../../static/WordPaster/js/w'import{zyOffice}from'../../static/zyOffice/js/o'import{zyCapture}from'../../static/zyCapture/z'

添加工具栏

//添加导入excel工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importExcel()}varregister$1=function(editor){editor.ui.registry.addButton('excelimport',{text:'',tooltip:'导入Excel文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('excelimport',{text:'',tooltip:'导入Excel文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('excelimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加word转图片工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importWordToImg()}varregister$1=function(editor){editor.ui.registry.addButton('importwordtoimg',{text:'',tooltip:'Word转图片',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('importwordtoimg',{text:'',tooltip:'Word转图片',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('importwordtoimg',function(editor){Buttons.register(editor);});}Plugin();}());//添加粘贴网络图片工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().UploadNetImg()}varregister$1=function(editor){editor.ui.registry.addButton('netpaster',{text:'',tooltip:'网络图片一键上传',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('netpaster',{text:'',tooltip:'网络图片一键上传',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('netpaster',function(editor){Buttons.register(editor);});}Plugin();}());//添加导入PDF按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().ImportPDF()}varregister$1=function(editor){editor.ui.registry.addButton('pdfimport',{text:'',tooltip:'导入pdf文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('pdfimport',{text:'',tooltip:'导入pdf文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('pdfimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加导入PPT按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importPPT()}varregister$1=function(editor){editor.ui.registry.addButton('pptimport',{text:'',tooltip:'导入PowerPoint文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('pptimport',{text:'',tooltip:'导入PowerPoint文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('pptimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加导入WORD按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importWord()}varregister$1=function(editor){editor.ui.registry.addButton('wordimport',{text:'',tooltip:'导入Word文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('wordimport',{text:'',tooltip:'导入Word文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('wordimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加WORD粘贴按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');varico="http://localhost:8080/static/WordPaster/plugin/word.png"functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).PasteManual()}varregister$1=function(editor){editor.ui.registry.addButton('wordpaster',{text:'',tooltip:'Word一键粘贴',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('wordpaster',{text:'',tooltip:'Word一键粘贴',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('wordpaster',function(editor){Buttons.register(editor);});}Plugin();}());

在线代码:

添加插件

// 插件plugins:{type:[String,Array],// default: 'advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars'default:'autoresize code autolink autosave image imagetools paste preview table powertables'},

点击查看在线代码

初始化组件

// 初始化WordPaster.getInstance({// 上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:'http://localhost:8891/upload.aspx',// 为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:'http://localhost:8891{url}',// 设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:'file',// 提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:''})

在页面中引入组件

功能演示

编辑器

在编辑器中增加功能按钮

导入Word文档,支持doc,docx

导入Excel文档,支持xls,xlsx

粘贴Word

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

Word转图片

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

导入PDF

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

导入PPT

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

上传网络图片

一键自动上传网络图片。

下载示例

点击下载完整示例

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

探索近乎完全消光的圆二色超反射镜与圆偏振光设置

近乎完全消光的圆二色超反射镜 圆偏振光的设置在光学领域,圆二色超反射镜以及圆偏振光的相关研究一直是极具吸引力的方向。今天咱们就来聊聊近乎完全消光的圆二色超反射镜以及圆偏振光的设置那些事儿。 近乎完全消光的圆二色超反射镜 圆二色性(CD&#…

作者头像 李华
网站建设 2026/10/30 23:32:01

Wan2.2-T2V-A14B用于城市交通流量模拟可视化展示

Wan2.2-T2V-A14B:让城市交通“动”起来的AI视觉引擎 你有没有想过,未来的交通指挥中心不再是一堆密密麻麻的折线图和数字报表,而是一块块高清大屏上实时“播放”的动态街景?车流如织、红绿灯切换、公交专用道畅通无阻——这一切不…

作者头像 李华
网站建设 2026/10/30 9:24:16

Docker + 多模态Agent = 王炸组合?5个真实生产环境编排案例深度剖析

第一章:Docker与多模态Agent融合的架构演进随着人工智能系统向复杂化、分布式方向发展,Docker容器技术与多模态Agent系统的融合成为现代智能架构的重要演进路径。该融合模式通过容器化封装实现多模态感知、决策与执行模块的解耦,提升系统可扩…

作者头像 李华
网站建设 2026/10/30 8:23:25

你用过哪些国产实时数据库?

随着中国数字经济加速发展,国产数据库正从政策驱动的“替代”走向技术创新驱动的“超越”。在这样一个快速增长的市场中,实时数据库作为连接工业现场与信息系统的关键桥梁,其重要性日益凸显。而在这个细分赛道中,大庆紫金桥软件技…

作者头像 李华
网站建设 2026/10/31 1:50:03

Android v4l2 camera apk:快速实现摄像头调试的终极工具

Android v4l2 camera apk:快速实现摄像头调试的终极工具 【免费下载链接】Androidv4l2cameraapk资源介绍 Android v4l2 camera apk是一款专为开发者设计的摄像头功能实现工具,支持在Android设备上进行摄像头预览和调试。它兼容多种Android版本&#xff0…

作者头像 李华
网站建设 2026/10/30 2:00:22

【STM32】低功耗

目录1 什么是低功耗?2 STM32电源系统结构3 低功耗模式介绍3.1 睡眠模式(sleep mode)3.2 停机模式(stop mode)3.3 待机模式(standby mode)4 寄存器及库函数介绍小实验:低功耗实验1 什…

作者头像 李华