STM32 07 对射式红外传感器计次
2026/7/24 11:00:05
作为金融行业前端开发人员,在2025年第二季度接到紧急需求:需为现有业务系统新增Word/PDF文档导入功能,重点要求完整保留文档中的图文混排样式及公式内容。当前系统架构为Vue2-CLI前端框架+TinyMCE4富文本编辑器,后端采用SpringBoot框架,数据库为MySQL。
paste_data_images:true配置可实现基础图片粘贴,但存在三大缺陷:.docx文件解析,但.doc格式兼容性差DrawingML对象,代码复杂度增加40%| 组件 | 方案 | 优势 | 风险控制措施 |
|---|---|---|---|
| 前端 | TinyMCE4+WordPaster插件 | 金融行业案例多,支持国产化环境 | 购买商业授权获取源码级支持 |
| 后端 | Apache POI+Aspose.Words | 双引擎备份,Aspose处理复杂文档 | Aspose使用试用版进行功能验证 |
| 存储 | 七牛云对象存储 | 符合金融级数据安全要求 | 启用HTTPS+防盗链+日志审计 |
// main.js 全局配置importTinyMCEfrom'@tinymce/tinymce-vue'import'wordpaster/js/wordpaster'// 引入商业插件Vue.component('tinymce-editor',{props:['value'],mounted(){constself=thistinymce.init({selector:`#${this.editorId}`,plugins:'wordpaster image code table',toolbar:'wordpaster | undo redo | styleselect',paste_data_images:true,wordpaster_upload_url:'/api/upload',// 七牛云上传接口setup:(editor)=>{editor.on('WordPasterBeforePaste',(e)=>{// 金融文档特殊处理:过滤Excel嵌入对象if(e.content.indexOf('vnd.ms-excel')>-1){e.preventDefault()self.$message.error('不支持Excel嵌入对象')}})}})}})// DocumentController.java@PostMapping("/import/word")publicResponseEntityimportWord(@RequestParam("file")MultipartFilefile){try{// 双引擎处理机制StringhtmlContent;if(file.getOriginalFilename().endsWith(".docx")){htmlContent=poiParser.parseDocx(file.getInputStream());}else{htmlContent=asposeParser.parseDoc(file.getInputStream());}// 图片转存处理ListimageUrls=imageProcessor.extractAndUpload(htmlContent,qiniuConfig.getBucket(),qiniuConfig.getAccessKey());returnResponseEntity.ok(newImportResult(htmlContent.replace(TEMP_IMAGE_TAG,String.join(",",imageUrls)),imageUrls.size()));}catch(Exceptione){log.error("文档解析失败",e);thrownewBusinessException("DOC_PARSE_ERROR");}}-- 文档元数据表(MySQL 8.0)CREATETABLEdocument_metadata(idBIGINTPRIMARYKEYAUTO_INCREMENT,file_nameVARCHAR(255)NOTNULL,file_hashCHAR(64)NOTNULLCOMMENT'SHA-256校验值',content_typeENUM('WORD','PDF','EXCEL')NOTNULL,storage_pathVARCHAR(512)NOTNULLCOMMENT'七牛云对象存储路径',preview_urlVARCHAR(512)COMMENT'CDN加速地址',create_timeDATETIME(3)DEFAULTCURRENT_TIMESTAMP(3),update_timeDATETIME(3)DEFAULTCURRENT_TIMESTAMP(3)ONUPDATECURRENT_TIMESTAMP(3),INDEXidx_hash(file_hash),INDEXidx_create_time(create_time))ENGINE=InnoDBROW_FORMAT=DYNAMIC;// 内容安全扫描服务publicclassContentScanner{privatestaticfinalPatternMALICIOUS_PATTERN=Pattern.compile("()|(onerror\\s*=)|(expression\\s*\\()|(%3Cscript)",Pattern.CASE_INSENSITIVE);publicstaticbooleanisSafe(Stringcontent){return!MALICIOUS_PATTERN.matcher(content).find();}}@Async("taskExecutor")publicCompletableFutureasyncProcess(MultipartFilefile){// 耗时操作(如Aspose解析)returnCompletableFuture.completedFuture(null);}兼容性测试矩阵:
| 浏览器 | Word版本 | 测试结果 |
|---|---|---|
| Chrome 120 | Office 2019 | ✅ |
| Firefox 115 | WPS 2023 | ⚠️(需修复列表样式) |
| Edge 120 | Office 365 | ✅ |
灰度发布策略:
.docx新特性此次开发成功解决金融行业文档导入的三大核心需求:样式保真度、数据安全性、处理性能,为后续数字化办公转型奠定坚实基础。
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转换成图片上传到服务器中。
一键自动上传网络图片。
点击下载完整示例