《Word转存大作战:一个穷学生的CMS升级日记》
一、需求分析与绝望的开始
作为一名月生活费2000还要养女朋友的计科狗,当我看到产品经理(其实就是我自己)提出的需求时,手里的泡面突然不香了:
-
核心需求:
- Word内容带格式粘贴(表格/公式/形状全保留)
- 图片自动上传到OSS(我的阿里云账户在颤抖)
- 多格式文件导入(还要保留样式!)
- LaTeX转MathML(数学系女友的特别要求)
-
技术现状:
- 前端:Vue2 + UEditor(远古版本)
- 后端:PHP(还在用mysql_connect的那种)
- 预算:99元(买杯奶茶都要犹豫三天)
二、全网掘地三尺找方案
第一天:GitHub挖宝记
搜索关键词:“word paste keep format ueditor plugin”
发现宝藏:
-
wangEditor的word-paste-module(Star 3.2k)
- 优点:免费!支持图片上传
- 缺点:公式支持不行,表格样式会崩
-
KindEditor的word插件(最后更新:2016年)
- 优点:有现成的PHP后端
- 缺点:不支持Vue,代码像考古发现的
// 尝试集成wangEditor的惨痛经历
import E from 'wangeditor'
const editor = new E('#editor')
editor.config.pasteFilterStyle = false // 关闭样式过滤
editor.config.pasteTextHandle = (content) => {
// 这里应该处理Word内容...但我不会!
return content.replace(//g, match => {
// 理论上应该上传图片...但怎么拿到文件流?
return ''
})
}
第二天:CSDN悬赏问答
发帖标题:“99元求Word粘贴插件,可接受学生作品”
收到回复:
- 某培训机构:“来我们这学全栈开发,原价19800,学生价只要998!”
- 某热心网友:“用这个轮子:xxx.com,只要88元”
- 下载后发现是加密的PHP文件,注释写着"解密联系QQ123456"
第三天:技术群跪求大佬
在223813913群的聊天记录:
我:[红包0.01] 大佬们救命啊!
A哥:你这需求得加钱
B姐:我们公司用的TinyMCE专业版,一年8万
C学长:我毕业设计做过类似的,代码早删了
三、穷逼解决方案
1. 前端魔改方案
// ueditor.config.js 魔改配置
window.UEDITOR_CONFIG = {
// 启用word粘贴插件
wordImageUrl: "/api/upload_word_image", // 图片上传接口
wordMediaUrl: "/api/upload_word_media", // 多媒体上传接口
catchRemoteImage: true, // 抓取远程图片
latexToMathML: true, // 这个配置其实不存在,是我YY的
}
// 自定义按钮(假装是官方功能)
UE.registerUI('wordpaste', function(editor) {
var btn = new UE.ui.Button({
icon: 'wordpaste',
tooltip: '粘贴Word内容',
click: function() {
editor.execCommand('wordpaste'); // 这个命令也不存在...
}
});
return btn;
});
2. PHP后端处理(穷鬼版)
// upload_word_image.php
putObject($bucket, $filename, $image);
echo json_encode([
'success' => true,
'url' => 'https://'.$bucket.'.'.$endpoint.'/'.$filename
]);
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => '上传失败:'.$e->getMessage()
]);
}
四、最终实现效果
功能对比表
需求 | 实现程度 | 花费 |
---|---|---|
Word格式保留 | 60%(表格会歪) | 0元 |
图片自动上传 | 支持(但偶尔丢图) | 0元 |
LaTeX转MathML | 用截图代替(别打我) | 0元 |
多格式导入 | 仅Word基本可用 | 0元 |
我的头发 | 剩余30% | 无价 |
意外收获
- 在GitHub上发现latex2mathml开源库(虽然集成后公式显示像蚯蚓爬)
- 学会用phpword解析文档(能提取文字就是胜利)
- 获得女友安慰:“你做的东西再烂我也用”
五、给同病相怜者的建议
-
低配解决方案:
- 用Pandoc做格式转换(服务器装个命令行工具)
- MathJax渲染公式(放弃治疗版)
- 表格用截图大法(别告诉用户)
-
高配建议:
- 存钱买WPS云服务API(1980元/年)
- 抱紧学院项目大腿(蹭经费)
- 劝女友转专业(误)
六、技术交流邀请
欢迎加入我们的**“穷鬼技术交流群”**:
- QQ群:223813913
- 日常内容:
- 互扔GitHub星链
- 分享破解版工具(支持正版!)
- 吐槽面试被拒经历
- 交换各公司零食测评
最后分享我的毕设秘笈:
// 万能解决方案
if (problem_is_serious()) {
echo "建议考研延缓危机";
} else {
echo "重启试试";
}
(本文代码仅供娱乐,实际使用请准备至少99元预算)
复制插件目录
引入插件文件
UEditor 1.4.3.3示例
注意:不要重复引入jquery,如果您的项目已经引入了jq,则不用再引入jq-1.4
在工具栏中增加插件按钮
//工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义
toolbars: [
[
"fullscreen",
"source",
"|",
"zycapture",
"|",
"wordpaster","importwordtoimg","netpaster","wordimport","excelimport","pptimport","pdfimport",
"|",
"importword","exportword","importpdf"
]
]
初始化控件
var pos = window.location.href.lastIndexOf("/");
var api = [
window.location.href.substr(0, pos + 1),
"asp/upload.asp"
].join("");
WordPaster.getInstance({
//上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203ed
PostUrl: api,
//为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936
ImageUrl: "",
//设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45
FileFieldName: "file",
//提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1
ImageMatch: ''
});//加载控件
注意
如果接口字段名称不是file,请配置FileFieldName。ueditor接口中使用的upfile字段
点击查看详细教程
配置ImageMatch
匹配图片地址,如果服务器返回的是JSON则需要通过正则匹配
ImageMatch: '',
配置ImageUrl
为图片地址增加域名,如果服务器返回的图片地址是相对路径,可通过此属性添加自定义域名。
ImageUrl: "",
配置SESSION
如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3
效果
编辑器界面
导入Word文档,支持doc,docx
导入Excel文档,支持xls,xlsx
粘贴Word
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
Word转图片
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入PDF
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PPT
一键导入PPT文件,并将PPT转换成图片上传到服务器中。