Midjourney Ziatype印相全流程实战手册(含官方未公开--style raw适配矩阵与gamma校准表)
2026/5/12 18:40:10
天津XX软件公司 - 客户单位CMS系统新闻模块Word导入功能升级项目实施记录
客户单位需求:
项目目标:
| 方案 | 可行性评估 |
|---|---|
| TinyMCE官方插件 | 优势:原生支持样式保留,社区活跃; |
| 风险:国产化环境需二次开发图片上传逻辑。 | |
| Apache POI + OpenXML | 优势:完全控制Word解析过程; |
| 风险:开发周期长,样式保留需手动实现。 | |
| 商业中间件(如WPS开放平台) | 优势:功能完善,支持信创认证; |
| 风险:成本高,需对接第三方API。 | |
| 开源库(Mammoth.js) | 优势:轻量级; |
| 风险:样式兼容性差,仅支持基础格式。 | |
| 开源插件(WordPaster) | 优势:与原文档保持1:1样式,完全开放产品源代码,支持信创国产化环境, |
| 风险:需要安装插件。 |
|决策:采用TinyMCE 5.10 + 自定义SpringBoot后端服务,平衡开发效率与国产化适配需求。
tinymce-wordimport插件(开源版扩展)。步骤1:集成TinyMCE编辑器并配置自定义按钮。
// main.jsimport'tinymce/plugins/paste';import'tinymce/plugins/importcss';import'./plugins/wordimport';// 自定义插件tinymce.init({selector:'#news-editor',plugins:'paste importcss wordimport',toolbar:'wordimport',setup:(editor)=>{editor.ui.registry.addButton('wordimport',{text:'导入Word',onAction:()=>{constinput=document.createElement('input');input.type='file';input.accept='.docx';input.onchange=async(e)=>{constfile=e.target.files[0];consthtml=awaitconvertWordToHtml(file);// 调用后端APIeditor.setContent(html);};input.click();}});}});步骤2:实现Word内容预处理。
docx-preview库在前端渲染Word大纲,供用户确认样式。步骤1:文件解析服务。
// WordParserService.javapublicStringparseWordToHtml(MultipartFilefile)throwsIOException{XWPFDocumentdoc=newXWPFDocument(file.getInputStream());Stringhtml=newXHTMLConverter().convert(doc,null,null);// Apache POI扩展// 提取图片并上传Patternpattern=Pattern.compile("src=\"data:image/(.*?);base64,(.*?)\"");Matchermatcher=pattern.matcher(html);while(matcher.find()){Stringbase64=matcher.group(2);StringimageUrl=uploadImageToServer(base64,matcher.group(1));html=html.replace(matcher.group(0),"src=\""+imageUrl+"\"");}returnhtml;}步骤2:国产化存储适配。
spring:datasource:url:jdbc:dm://192.168.1.100:5236/CMS_DBdriver-class-name:dm.jdbc.driver.DmDriverhikari:maximum-pool-size:10-Dfile.encoding=UTF-8启动JVM。-march=loongarch64编译Native库。READ COMMITTED。项目负责人签字:_________________
客户单位代表签字:_________________
日期:2025年XX月XX日
备注:本项目代码已开源至Gitee信创专区,供客户单位二次开发参考。
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内容,自动上传Word中的图片,保留文字样式。
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
一键导入PPT文件,并将PPT转换成图片上传到服务器中。
一键自动上传网络图片。
点击下载完整示例