news 2026/5/14 6:13:24

TinyMCE跨平台实现Word图片转存服务器路径配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TinyMCE跨平台实现Word图片转存服务器路径配置

【PHP码农の逆袭】680元预算用PHP硬刚Office文档导入!甲方爸爸直呼“真香”


一、甲方爸爸的“离谱”需求

作为江苏某外包公司“扛把子”PHP程序员,最近接了个CMS官网项目,甲方需求堪称“离谱但合理”:

  1. 核心功能
    • TinyMCE编辑器加按钮,支持Word/Excel/PPT/PDF一键导入,保留字体、颜色、表格、公式(LaTeX/MathType)、形状组,甚至EMZ/WMZ这种“上古”格式。
    • Word粘贴:直接复制Word内容到编辑器,图片自动上传阿里云OSS。
    • 公众号内容导入:甲方说“领导只会从公众号复制,不会排版”。
    • 公式渲染:LaTeX转MathML,多终端(PC/手机/平板/小程序/APP)高清显示。
  2. 技术约束
    • 前端:Vue2 + TinyMCE(甲方说“别升级Vue3,怕兼容性问题”)。
    • 后端:PHP(用Zend Studio开发,甲方说“经典技术栈,安全!”)。
    • 数据库:MySQL(存储文章元数据,图片存OSS)。
    • 服务器:阿里云ECS(公有云+私有云混合部署,甲方说“安全第一”)。
    • 预算:680元(甲方说“这是最后报价,再砍价就找大学生做了”)。
  3. 社交需求
    • 建个QQ群(223813913),新人加群领1~99元红包(钱不多,图个热闹)。
    • 搞代理商机制,推荐客户提20%(比如成交1万,你拿2000元,甲方爸爸的预算就是我的提成了)。

二、开源组件筛选:PHP白嫖党的自我修养
1. TinyMCE插件选型
  • 目标:找个能解析Office文档、自动上传图片到OSS的插件。
  • 候选方案
    • tiny-mce-plugin-powerpaste(商业插件,试用版免费):
      • 优点:支持Word粘贴,图片自动上传,但LaTeX公式支持差。
    • 自定义插件(穷人最终方案)
      • 用TinyMCE的pastefile_picker_callbackAPI,结合PHP处理文档解析和图片上传。
2. 公式处理
  • LaTeX转MathML
    • 前端用MathJax(但多端兼容性差)。
    • 后端用PHP调用Pandoc(通过exec()执行命令行,穷但有效)。
  • MathType公式
    • 识别图片格式(如EMZ/WMZ),用PHP转PNG后上传OSS。
3. 文件导入(Word/Excel/PPT/PDF)
  • 方案
    • PHPWord(解析Word/DOCX)。
    • PHPExcel/PHPOffice(解析Excel)。
    • PHPPresentation(解析PPTX)。
    • TCPDF/FPDI(解析PDF)。
    • 统一处理:解析后提取HTML和图片,图片上传OSS,HTML塞进TinyMCE。

三、开发过程:PHP码农的“暴力”编码
1. 前端:Vue2 + TinyMCE定制插件
  • 步骤1:安装TinyMCE和基础插件:
    npminstall@tinymce/tinymce-vue
  • 步骤2:自定义插件(office-import.js):
    tinymce.PluginManager.add('office-import',function(editor){editor.ui.registry.addButton('office-import',{text:'导入文档',onAction:()=>{constinput=document.createElement('input');input.type='file';input.accept='.docx,.xlsx,.pptx,.pdf';input.onchange=async(e)=>{constfile=e.target.files[0];constformData=newFormData();formData.append('file',file);constres=awaitfetch('/api/import-office.php',{method:'POST',body:formData});constdata=awaitres.json();editor.setContent(data.html);};input.click();}});});
  • 步骤3:在Vue中集成:
2. 后端:PHP处理文档解析和图片上传
  • 图片上传到OSS
    // upload_to_oss.php$base64=$_POST['base64'];$imageData=base64_decode(explode(',',$base64)[1]);$ossClient=newAliyun\OSS\OssClient('endpoint','key','secret');$object='images/'.uniqid().'.png';$ossClient->putObject('bucket',$object,$imageData);echojson_encode(['url'=>"https://bucket.oss-cn-hangzhou.aliyuncs.com/{$object}"]);
  • LaTeX转MathML(Pandoc调用)
    // latex_to_mathml.php$latex=$_POST['latex'];$mathml=shell_exec("echo '{$latex}' | pandoc -f latex -t mathml");echo$mathml;
  • Word解析(PHPWord示例)
    // import_office.phprequire'vendor/autoload.php';$file=$_FILES['file']['tmp_name'];if(pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION)==='docx'){$phpWord=\PhpOffice\PhpWord\IOFactory::load($file);$htmlWriter=new\PhpOffice\PhpWord\Writer\HTML($phpWord);$html=$htmlWriter->getContent();// 提取图片并上传OSS(同上)echojson_encode(['html'=>$html]);}// 其他格式(Excel/PPT/PDF)类似处理
3. 公众号内容处理
  • 前端调用
    // 用户从公众号复制内容后,调用此函数functioncleanWechatContent(html){// 移除公众号冗余标签(如wx-tag)returnhtml.replace(/]*>|<\/wx-tag>/g,'');}
  • 后端处理
    • DOMDocument清理无效标签,保留样式。

四、成果展示:甲方爸爸的“真香”现场
  1. Word粘贴效果
    • 表格、字体、颜色全保留。
    • 图片自动上传OSS,替换为URL。
  2. 公式渲染
    • PC/手机/平板全终端高清显示(MathML的功劳)。
  3. 文件导入
    • Word/Excel/PPT/PDF都能导,样式不乱。

五、恰饭时间:接单群和内推
  1. QQ群:223813913
    • 新人加群领1~99元红包(钱不多,但能买几杯奶茶)。
    • 推荐客户提20%(比如成交1万,你拿2000元,甲方爸爸的预算就是我的提成了)。
  2. 内推需求
    • 兄弟们看看我!会写PHP/Vue/Java,能扛996,求内推!

最后一句暴躁发言

“680元做全功能?甲方爸爸以为我是用爱发电?
(群号再发一遍:223813913,进群送红包,不送是狗!)”

复制插件

安装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/5/14 4:30:21

双向全桥LLC谐振变换器仿真:非对称拓扑与变频控制实现

双向全桥LLC谐振变换器仿真&#xff0c;非对称拓扑&#xff0c;双向模型 正向LLC&#xff0c;反向LC 采用变频控制的闭环模型 运行环境包括matlab/simulink&#xff0c;plecs等 ~在电力电子领域&#xff0c;谐振变换器因其无纹波输出的特点而受到广泛关注。本文将围绕一种基于非…

作者头像 李华
网站建设 2026/5/4 19:52:27

13、UNIX系统下C语言的进程间通信详解

UNIX系统下C语言的进程间通信详解 1. 进程间通信概述 在UNIX系统中,进程间通信(IPC)是非常重要的功能。System V IPC有三种不同的形式:消息队列、信号量和共享内存。虽然它们不如Berkeley UNIX方法简单和通用,但各自都有其适用场景。 这三种形式有一些共同的特点: - …

作者头像 李华
网站建设 2026/5/11 11:20:02

Dify镜像在政府公共服务智能化中的探索

Dify镜像在政府公共服务智能化中的探索 在政务服务大厅里&#xff0c;一位老人站在自助终端前犹豫着&#xff1a;“我想问问退休后医保怎么用……”他不知道该点哪个按钮&#xff0c;也记不清政策文件的名称。如果这台机器不仅能听懂他的问题&#xff0c;还能主动引导他完成备案…

作者头像 李华
网站建设 2026/5/11 11:19:50

10、SharePoint关键设置与操作指南

SharePoint关键设置与操作指南 数据库升级与故障排查 在进行数据库升级时,首先要确保数据库的只读属性为 false 。若为 true ,需将其改为 false 后再尝试升级。升级数据库可使用以下命令: Upgrade-SPContentDatabase <DatabaseName> -skipintegritycheckssk…

作者头像 李华
网站建设 2026/5/11 4:23:18

19、网络数据包工具与页面性能相关工具介绍

网络数据包工具与页面性能相关工具介绍 在网络和页面性能的管理与故障排查中,有许多实用的工具可供选择。下面将详细介绍一些常用工具的使用方法和特点。 网络数据包捕获工具 NetMon 和 Message Analyzer 启动捕获 :选择局域网(LAN)并点击“开始”,新的会话将开启。以…

作者头像 李华
网站建设 2026/5/11 11:20:01

如何在macOS上用Open-AutoGLM打造私有化大模型服务(完整教程)

第一章&#xff1a;macOS上Open-AutoGLM私有化部署概述在 macOS 平台上实现 Open-AutoGLM 的私有化部署&#xff0c;为开发者和企业提供了本地化、安全可控的大语言模型运行环境。该部署方式无需依赖云端服务&#xff0c;所有数据处理均在本地完成&#xff0c;适用于对隐私保护…

作者头像 李华