Java字符流FileReader与FileWriter详解:编码、缓冲与避坑指南
2026/10/14 4:05:20
“老板说要给TinyMCE5加个Word一键转存功能,还要支持公式渲染和多终端适配,预算99元?这特么比用Excel算提成还刺激!”
(掏出祖传PHP手册和Vue3速成宝典)
前端插件:
powerpaste插件(商业版$300,卒)tinymce-paste-image(GitHub开源)+ 自定义Word解析器后端处理:
PhpOffice库解析DOCX(免费但坑多)// src/components/Editor.vueimport{ref}from'vue';importEditorfrom'@tinymce/tinymce-vue';import'tinymce/plugins/paste';import'tinymce/plugins/table';import'tinymce/plugins/advlist';constcontent=ref('');consteditorConfig={plugins:'paste table advlist',toolbar:'paste wordpaste | formatselect | bold italic | table',setup:(editor)=>{editor.ui.registry.addButton('wordpaste',{text:'Word粘贴',onAction:()=>{editor.execCommand('mceInsertClipboardContent',false,{content:'<div class="word-content">等待粘贴...</div>'});}});}};consthandlePaste=(e)=>{constclipboardData=e.clipboardData;if(!clipboardData)return;// 检测Word粘贴的特殊格式constwordHtml=clipboardData.getData('text/html');if(wordHtml.includes('mso-')){// 调用后端API处理Word内容fetch('/api/parse-word',{method:'POST',body:JSON.stringify({html:wordHtml})}).then(res=>res.json()).then(data=>{content.value=data.processedHtml;});}};// app/Http/Controllers/WordParserController.phppublicfunctionparseWord(Request$request){$html=$request->input('html');// 1. 提取图片并上传OSSpreg_match_all('/]+src="([^"]+)"/i',$html,$matches);foreach($matches[1]as$imgUrl){$imgData=file_get_contents($imgUrl);$ossPath='word_images/'.uniqid().'.png';OSS::put($ossPath,$imgData);$html=str_replace($imgUrl,env('OSS_URL').$ossPath,$html);}// 2. 公式转换(调用Node服务)$html=preg_replace_callback('/\\$(.*?)\\$/',function($matches){$latex=urlencode($matches[1]);$nodeUrl="http://node-service:3000/convert?latex={$latex}";$mathml=file_get_contents($nodeUrl);return$mathml;},$html);// 3. 清理Word垃圾样式$html=strip_tags($html,'');$html=preg_replace('/style="[^"]*"/i','',$html);returnresponse()->json(['processedHtml'=>$html]);}// server.js (运行在回源带宽1Mbps的学生机上)constexpress=require('express');constkatex=require('katex');constapp=express();app.get('/convert',(req,res)=>{try{constlatex=decodeURIComponent(req.query.latex);constmathml=katex.renderToString(latex,{output:'mathml',throwOnError:false});res.send(mathml);}catch(e){res.status(400).send('公式解析失败');}});app.listen(3000,()=>console.log('公式服务启动,每月省下200元奶茶钱!'));白嫖资源:
求职暗号:
# 技能清单 - 精通用99元预算完成9999元需求 - 擅长在Vue3和PHP之间架起爱的桥梁 - 阿里云OSS上传速度优化经验(实测3KB/s)赚钱攻略:
// 群机器人自动分账系统functioncalculateCommission(orderAmount){consttiers={bronze:0.2,gold:0.5// 需要拉5个下线解锁};returnorderAmount*tiers.bronze;}![效果图描述:TinyMCE编辑器中完美显示的Word文档,包含:
(实际效果取决于你的头发剩余量)
加入技术交流群获取完整源码:
tinymce-word-paste-plugin.zipphp-word-parser.tar.gz(温馨提示:本群不承诺月入过万,但保证能学会用Excel算提成)
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转换成图片上传到服务器中。
一键自动上传网络图片。
点击下载完整示例