各位爷们儿,咱西安程序员又双叒叕接到个神仙需求!客户要给CKEditor装个"超级粘贴板",说是要能直接从Word里Ctrl+C/V,连Excel表格、PPT公式、PDF图片都要原样搬过来。这哪是编辑器啊,这分明是要造个"文档搬运工"啊!

不过咱是谁?西安码农界的扛把子!先给各位秀段Vue3的骚操作:




import { ref } from 'vue';
import ClassicEditor from '@ckeditor/ckeditor5-build-classic';

const Editor = ClassicEditor.create(document.createElement('div'), {
  extraPlugins: [require('./plugins/wordimport')] // 重点在这儿!
});

const importFromWord = async () => {
  // 调起文件选择器
  const file = await showFilePicker(['.docx', '.xlsx', '.pdf']);
  
  // 偷偷告诉后端:"快处理这个文件!"
  const result = await fetch('/api/import', {
    method: 'POST',
    body: file
  });
  
  // 把处理好的HTML塞进编辑器
  const html = await result.text();
  Editor.setData(html);
};

后端咱用PHP写个接口(毕竟要兼容IIS嘛):

 {
            const button = new ButtonView(locale);
            button.set({
                label: '导入Word',
                icon: '📄',
                tooltip: true
            });

            button.on('execute', () => {
                // 调起前端文件选择器
                const input = document.createElement('input');
                input.type = 'file';
                input.accept = '.docx,.xlsx,.pdf';
                
                input.onchange = async e => {
                    const file = e.target.files[0];
                    const formData = new FormData();
                    formData.append('file', file);
                    
                    const response = await fetch('/api/import', {
                        method: 'POST',
                        body: formData
                    });
                    
                    const html = await response.text();
                    editor.model.change(writer => {
                        // 这里要处理CKEditor的模型转换
                        // 实际代码比这复杂100倍...
                    });
                };
                
                input.click();
            });

            return button;
        });
    }
}

module.exports = WordImport;

【技术难点破解】

  1. 公式处理:用pandoc转换LaTeX到MathML,配合MathJax渲染
  2. 形状组:先转成SVG再上传,用canvas处理复杂图形
  3. 微信内容:专门写个爬虫模拟浏览器复制
  4. 兼容性:测试了200种Word样式,发现最坑的是"宋体+红色下划线"组合

【群主卖瓜时间】
各位老铁,这插件包现在群里限时特惠!原价680,现在加入QQ群223813913:

  1. 立领1-99元红包(手气最佳经常领88)
  2. 推荐客户拿20%提成(比如680的项目直接赚136)
  3. 每周三晚8点技术直播(手把手教你怎么改源码)
  4. 群文件有完整Demo(含React版本)

上周末刚帮某政府网站搞定这个需求,客户爸爸直接打赏了888!现在躺着赚提成不香吗?群里@群主还能领《CKEditor插件开发秘籍》电子版!

(突然正经)说真的,这需求在政企市场特别吃香,咱们群里有现成的解决方案,比自己开发省90%时间。要赚外快的兄弟赶紧上车,错过这村可没这店了!

复制插件

说明:此教程以CKEditor4.x为例,使用其他编辑器的查看对应教程。
将下列文件夹复制到项目中
/WordPaster
/ckeditor/plugins/imagepaster
/ckeditor/plugins/netpaster
/ckeditor/plugins/pptpaster
/ckeditor/plugins/pdfimport

上传插件

wordpaster文件夹

上传插件文件夹

将imagepaster,netpaster文件夹上传到现有项目ckeditor/plugins目录中
插件文件夹

在工具栏中增加插件按钮

插件按钮

CKEDITOR.replace('editor1',{
			extraPlugins:'zycapture,imagepaster,importwordtoimg,netpaster,wordimport,excelimport,pptimport,pdfimport,importword,exportword,importpdf',
			keystrokes:[[CKEDITOR.CTRL + 86/*V*/,'imagepaster']],
			on:
			{
				currentInstance:function()
				{
					//多个编辑器时为控件设置当前编辑器
					WordPaster.getInstance().SetEditor(CKEDITOR.currentInstance);
					window.zyCapture.setEditor(this);
					window.zyOffice.SetEditor(this);
				}
			},
			//https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent
			allowedContent:true//不过滤样式
		});

引用js

引用JS






初始化控件

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: '',
	Cookie: 'PHPSESSID='			
});//加载控件

配置上传接口

初始化控件

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: '',
	        Cookie: '<%=clientCookie%>',
	        event:{
				dataReady:function(e){
					//e.word,
					//e.imgs:tag1,tag2,tag3
					console.log(e.imgs)
				}
			}	        
	    });//加载控件

注意

1.如果接口字段名称不是file,请配置FileFieldName。ueditor接口中使用的upfile字段
字段名称
点击查看详细教程

配置ImageMatch

用于匹配JSON数据,
匹配地址
点击查看详细教程

配置ImageUrl

用于为图片增加域名前缀
自定义域名
点击查看详细教程

配置Session

如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:点击查看详细教程

说明

1.请先测试您的接口:点击查看详细教程

功能演示

编辑器界面

image

导入Word文档,支持doc,docx

粘贴Word和图片

导入Excel文档,支持xls,xlsx

粘贴Word和图片

粘贴Word

一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
粘贴Word和图片

Word转图片

一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入Word转图片

导入PDF

一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PDF转图片

导入PPT

一键导入PPT文件,并将PPT转换成图片上传到服务器中。
导入PPT转图片

上传网络图片

一键自动上传网络图片,自动下载远程服务器图片,自动上传远程服务器图片
自动上传网络图片

下载示例

点击下载完整示例

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐