震惊!程序员接单竟发现致富新大陆?!
大家好,我是北京某不知名.NET程序员小王。最近接了个CMS企业官网项目,客户说要加个Word一键粘贴功能,要求还挺多:
- 要支持Office全家桶导入
- 公式转换要高级(LaTeX→MathML)
- 还得兼容高龄用户(老板的爸爸要用)
- 预算680块(老板说这是友情价)
技术选型血泪史
本来想直接用KindEditor的,结果发现:
- 公式支持:emz/wmz格式直接GG
- 样式保留:复制粘贴后直接变抽象画
- 微信公众号内容:粘贴后图片全变404
我试了市面上所有开源方案:
- CKEditor:公式插件收费
- TinyMCE:导入功能像抽奖
- WangEditor:对高龄用户太不友好
终极解决方案
最后我决定自己撸一个插件!下面是核心代码:
前端部分 (Vue3)
// Word粘贴魔法插件
const wordPastePlugin = {
install(editor) {
editor.addButton('word_paste', {
title: 'Word一键粘贴',
icon: 'word',
click: async function() {
const clipboardItems = await navigator.clipboard.read();
for (const clipboardItem of clipboardItems) {
for (const type of clipboardItem.types) {
if (type === 'text/html') {
const blob = await clipboardItem.getType(type);
let html = await blob.text();
// 魔法转换开始
html = await transformOfficeContent(html);
// 插入编辑器
editor.insertHtml(html);
}
}
}
}
});
}
}
// 注册插件
KindEditor.use(wordPastePlugin);
后端部分 (C#)
// Office文档转换器
public class OfficeConverter
{
public async Task ConvertWordToHtml(IFormFile file)
{
// 用Aspose.Words搞事情(虽然买不起正版)
var doc = new Document(file.OpenReadStream());
// 处理数学公式
foreach (Shape shape in doc.GetChildNodes(NodeType.Shape, true))
{
if (shape.OleFormat != null && shape.OleFormat.ProgId == "Equation.3")
{
var latex = ExtractLatexFromOle(shape);
var mathML = LatexToMathML(latex);
shape.Remove();
// 插入MathML到文档...
}
}
// 保存为HTML
using var stream = new MemoryStream();
doc.Save(stream, SaveFormat.Html);
return Encoding.UTF8.GetString(stream.ToArray());
}
// 其他格式转换方法类似...
}
致富秘籍大公开
说到这个QQ群223813913,我必须得说:
- 新人红包:1-99元随机(我抢到过2毛)
- 会员升级:从青铜到王者(跟打游戏似的)
- 提成比例:20%起跳(最高50%!)
数学题时间:
1单1万 × 50% = 5000元
10单 = 5万元
年入百万不是梦!
(注意:以上收入数据未经考证,可能包含夸张成分)
真实项目建议
正经的说,要实现这个需求:
- 商业方案:推荐购买Aspose.Total(预算可能要加个0)
- 开源方案:PDF用PDF.js,公式用MathJax
- 混合方案:Word用mammoth.js,公式单独处理
最终我给客户的报价是:
- 基础功能:680元(只能复制文字)
- 完整功能:6800元(含公式转换)
- VIP尊享:68000元(送程序员上门服务)
客户选了…第一个选项😂
想一起讨论(或者一起做梦赚钱)的欢迎加群:223813913
(群里真有红包,虽然不大,但比老板给的预算大方)
上传工具栏插件文件夹
上传插件文件夹
控件初始化
在head中引入组件文件
注意,不要重复引入jquery,如果您的页面已经引入了jquery这里就不要再引入jquery 1.4了。
WordPaster For KindEditor-4.x
# 初始化组件
WordPaster.getInstance({
ui:{render:"wdpst"}//目标容器,一般为div
});
设置快捷键
将插件添加到工具栏,并挂载KindEditor的Ctrl+V快捷键事件
var editor;
KindEditor.ready(function (K)
{
editor = K.create('#content1'
,
{ items: [
'wordpaster','importwordtoimg','netpaster','wordimport','excelimport','pptimport','pdfimport', '|',
'importword','exportword','importpdf','|'
]
, afterCreate: function ()
{
WordPaster.getInstance().SetEditor(this);
var self = this;
//自定义 Ctrl + V 事件。
KindEditor.ctrl(self.edit.doc, 'V', function () { WordPaster.getInstance().Paste(); });
}
});
});
注意
1.如果接口字段名称不是file,请配置FileFieldName。
2.如果接口返回JSON,请配置ImageMatch
3.如果接口返回的图片地址没有域名,请配置ImageUrl
整合效果
效果
编辑器界面
导入Word文档,支持doc,docx
导入Excel文档,支持xls,xlsx
粘贴Word
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
Word转图片
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入PDF
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PPT
一键导入PPT文件,并将PPT转换成图片上传到服务器中。