news 2026/6/24 6:17:35

机械设计BOM系统TinyMCE如何避免Visio流程图粘贴失真?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机械设计BOM系统TinyMCE如何避免Visio流程图粘贴失真?

河南某集团企业项目需求评估与实施记录

一、项目背景与需求分析

作为集团项目负责人,近期接到业务部门需求:在企业网站后台管理系统(基于TinyMCE编辑器、Vue2/Vue3/React前端框架、SpringBoot后端)中新增Word粘贴文档导入功能,要求支持:

  1. Word粘贴:保留样式(表格、公式、字体、颜色等),图片自动上传至华为云OBS(兼容未来迁移至阿里云/腾讯云等),避免BASE64编码。
  2. 文档导入:支持Word/Excel/PPT/PDF,保留图片与样式。
  3. 信创兼容:操作系统(Windows/Linux/中标麒麟/统信UOS等)、浏览器(含IE8)、CPU(x86/arm/龙芯)。
  4. 授权模式:一次性买断,集团内无限制使用,预算≤68万元。
  5. 商务要求:提供5个国企/政府合作案例(含合同、转账凭证、信创认证、软著、营业执照)。
二、产品选型与评估
1. 候选产品筛选

通过市场调研,筛选出3款符合技术需求的富文本编辑器插件:

  • TinyMCE官方插件:功能有限,不支持复杂样式保留,排除。
  • Froala Editor:功能强大,但授权费超预算(单项目$5,000+,集团年费用超500万),且不支持买断。
  • 国产信创编辑器(如WEditor)
    • 优势
      • 完全兼容信创环境(中标麒麟/统信UOS/龙芯CPU)。
      • 支持Word/Excel/PPT/PDF导入,保留样式与图片。
      • 提供华为云OBS集成方案,支持多云迁移。
      • 一次性买断授权≤68万元,无项目数量限制。
    • 劣势
      • 需定制开发部分功能(如MathType公式兼容)。
2. 商务验证

要求厂商提供:

  • 5个政府项目案例(某省政务服务网、某央企OA系统等),含合同、转账凭证、信创认证。
  • 软件著作权证书、营业执照、法人身份证(核验真实性)。
  • 现场演示在统信UOS+龙芯CPU环境下运行。

结论:选择国产信创编辑器(WEditor)作为技术方案。

三、技术实现方案
1. 前端集成(Vue2示例)
// main.jsimportTinyMCEfrom'tinymce-vue';import'tinymce/plugins/weditor';// 信创编辑器插件Vue.use(TinyMCE);// 组件配置
2. 后端实现(SpringBoot)
// 图片上传至华为云OBS@RestController@RequestMapping("/api/upload")publicclassUploadController{@Value("${obs.endpoint}")privateStringendpoint;@PostMapping("/image")publicResponseEntityuploadImage(@RequestParam("file")MultipartFilefile){try{OBSClientobsClient=newOBSClient(ak,sk,endpoint);obsClient.putObject("your-bucket",file.getOriginalFilename(),file.getInputStream());Stringurl="https://"+endpoint+"/your-bucket/"+file.getOriginalFilename();returnResponseEntity.ok(url);}catch(Exceptione){returnResponseEntity.status(500).build();}}}
3. 文档导入处理
  • Word/Excel/PPT:使用Apache POI解析文档结构,提取图片与样式。
  • PDF:使用PDFBox或iText转换HTML,保留布局。
  • 公式兼容:通过MathML或LaTeX渲染(集成MathJax库)。
4. 信创环境适配
  • 浏览器兼容:通过Polyfill支持IE8(如es5-shim、html5shiv)。
  • CPU指令集:提供x86/arm/龙芯三版本二进制包。
  • 操作系统:打包为.deb/.rpm/.tar.gz格式,支持自动安装脚本。
四、项目风险与应对
  1. 授权风险:买断授权避免涨价,合同明确无项目数量限制。
  2. 信创兼容性:要求厂商提供30天免费试用,在统信UOS+龙芯环境验证。
  3. 性能优化
    • 图片上传采用分片传输,避免大文件阻塞。
    • 样式解析使用Web Worker多线程处理。
五、项目成果
  1. 功能交付
    • Word粘贴保留95%以上样式(含MathType公式)。
    • 文档导入平均耗时<3秒(10MB文件)。
    • 华为云OBS上传成功率99.9%。
  2. 成本节约
    • 一次性买断授权节省年授权费432万元(68万 vs 500万)。
  3. 客户反馈
    • 某省政府项目验收评分98/100,获“信创标杆案例”表彰。
六、后续计划
  1. 扩展支持WPS文档直接编辑(通过COM接口调用本地WPS)。
  2. 研发移动端适配,支持政务APP内嵌编辑器。
  3. 探索AI辅助写作功能(如自动生成政府公文模板)。

附件

  1. 厂商合作案例清单(含合同编号、转账凭证截图)。
  2. 信创环境兼容性测试报告(统信UOS+龙芯CPU)。
  3. 华为云OBS集成技术文档。

通过严格选型与定制开发,项目在预算内实现了信创环境下的高兼容性需求,为集团后续项目提供了标准化解决方案。

复制插件

安装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/6/19 1:39:22

教育平台TinyMCE4处理Word艺术字粘贴变成乱码如何修复?

作为陕西某软件公司的一名前端工程师&#xff0c;近期我接到了一个关键需求&#xff1a;需在企业网站的后台管理系统文章发布模块中&#xff0c;集成Word粘贴、Word文档导入及微信公众号内容粘贴&#xff08;含自动下载并上传公众号文章图片至服务器&#xff09;的功能。这一需…

作者头像 李华
网站建设 2026/6/14 6:56:00

朝鲜威胁行为体利用虚假招聘面试锁定软件开发者

据Securonix研究人员报告&#xff0c;疑似朝鲜的威胁行为体正试图通过虚假招聘面试诱骗软件开发者下载恶意软件。 这些威胁行为体会联系软件开发者&#xff0c;提供看似合法的就业机会&#xff0c;然后安排虚拟面试。 "在这些欺诈性面试中&#xff0c;开发者通常会被要求执…

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

模板编程——std::is_pointer的分析

一、模板元编程库 在C的标准库中提供了相关的元编程库&#xff0c;提供了一系列的对相关元编程相关的接口&#xff0c;极大的方便了开发者在元编程时的工作。在前面也分析过几个元编程的接口&#xff0c;今天接着分析一下指针处理的元编程接口std::is_pointer。 二、std::is_po…

作者头像 李华
网站建设 2026/6/10 20:36:14

亲测好用8个降AIGC网站推荐,千笔帮你轻松降AI率

AI降重工具&#xff1a;让论文更自然&#xff0c;更安心 在如今的学术写作中&#xff0c;AI生成内容虽然提高了效率&#xff0c;但也带来了AIGC率过高的问题。许多学生在提交论文前&#xff0c;都会面临一个共同的难题——如何有效降低AI痕迹&#xff0c;同时保持文章的逻辑性和…

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

java--线程安全问题

概念&#xff1a;Java线程安全问题&#xff0c;本质上是在多线程环境下&#xff0c;由于线程调度的不确定性&#xff0c;导致程序的执行结果与预期不符。 线程安全问题的产生通常可以归结为以下三个核心原因&#xff1a; 原子性问题 (Atomicity) 一个看似简单的操作&#xff0…

作者头像 李华