山东某国企项目需求实现记录:基于CKEditor4的信创兼容文档处理方案
一、需求分析与技术选型(PHP技术栈适配)
核心需求复核:
- 编辑器功能:
- Word粘贴(保留格式+图片二进制上传)
- 多格式导入(Word/Excel/PPT/PDF)
- 微信内容抓取(图片自动下载+OBS上传)
- 技术约束更新:
- 后端框架:PHP(需兼容Laravel/ThinkPHP等常见框架)
- 开发工具:Zend Studio(基于Eclipse的PHP IDE)
- 信创要求:覆盖国产操作系统+CPU架构
- 编辑器功能:
技术选型评估:
- 候选方案对比:
方案 优势 劣势 授权成本 CKEditor4+插件 成熟稳定,插件生态完善 需自行开发微信抓取模块 $35,000 UEditor(百度) 国内政府项目常用 已停止维护,信创兼容性差 免费 TinyMCE企业版 功能全面 年付$2,500,不符合买断需求 超出预算 最终选择 CKEditor4商业版 - 授权谈判成果:
- 买断CKEditor4核心+
pastefromword/uploadimage插件($28,000) - 补充采购
docx-converter文档转换插件($7,000) - 总授权成本:$35,000(约24.5万人民币)
- 买断CKEditor4核心+
- 授权谈判成果:
- 候选方案对比:
二、信创环境适配方案
交叉编译部署:
- PHP环境配置:
# 多架构基础镜像 FROM php:7.4-fpm-alpine ARG TARGETARCH # 安装信创依赖库 RUN apk add --no-cache \ libzip-dev \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install gd zip pdo_mysql # 华为云OBS SDK依赖 RUN pecl install obs && docker-php-ext-enable obs
- PHP环境配置:
信创系统兼容性矩阵:
系统/CPU PHP运行环境 测试结果 统信UOS + 鲲鹏 PHP 7.4 + Swoole ✅ 银河麒麟 + 龙芯 PHP 7.4 + Apache ✅ CentOS 7 + ARM PHP 7.4 + Nginx ✅
三、开发实现(PHP+Vue2)
前端集成(Vue2 + CKEditor4):
// ArticleEditor.vueexportdefault{data(){return{content:'',editorConfig:{extraPlugins:'pastefromword,uploadimage,docx-converter',filebrowserUploadUrl:'/api/upload',// PHP上传接口// 微信内容处理配置pastePreprocessor:(html)=>{if(isWechatContent(html)){returnthis.processWechatHtml(html);}returnhtml;}}};},methods:{asyncprocessWechatHtml(html){constimgUrls=extractWechatImages(html);constresponses=awaitPromise.all(imgUrls.map(url=>fetch('/api/download-wechat-img',{method:'POST',body:JSON.stringify({url})})));returnreplaceImagesWithUploadedUrls(html,responses);}}};PHP后端实现:
// FileUploadController.php (Laravel示例)classFileUploadControllerextendsController{publicfunctionupload(Request$request){$file=$request->file('upload');$extension=$file->getClientOriginalExtension();$filename=uniqid().'.'.$extension;// 二进制上传至华为云OBS$obsClient=newObsClient(['key'=>env('OBS_ACCESS_KEY'),'secret'=>env('OBS_SECRET_KEY'),'endpoint'=>env('OBS_ENDPOINT')]);$obsClient->putObject(['Bucket'=>env('OBS_BUCKET'),'Key'=>$filename,'Body'=>fopen($file->path(),'r')]);returnresponse()->json(['url'=>env('OBS_CDN_URL').'/'.$filename]);}publicfunctiondownloadWechatImage(Request$request){$imageUrl=$request->input('url');$content=file_get_contents($imageUrl);$tempPath=tempnam(sys_get_temp_dir(),'wechat_');file_put_contents($tempPath,$content);// 复用上传逻辑$request->files->set('upload',newUploadedFile($tempPath,basename($imageUrl),mime_content_type($tempPath),filesize($tempPath),null,true));return$this->upload($request);}}文档导入服务(PHP实现):
// DocumentImportService.phpclassDocumentImportService{publicfunctionimportWord($filePath){$phpWord=\PhpOffice\PhpWord\IOFactory::load($filePath);$html=new\PhpOffice\PhpWord\Shared\Html();return$html->toHtml($phpWord);}publicfunctionextractImages($html){preg_match_all('/]+src="([^">]+)"/i',$html,$matches);return$matches[1];}publicfunctionreplaceImagesWithObsUrls($html,array$newUrls){$images=$this->extractImages($html);for($i=0;$i<count($images);$i++){$html=str_replace($images[$i],$newUrls[$i],$html);}return$html;}}
四、信创安全加固
数据安全措施:
- 图片上传前进行病毒扫描(集成ClamAV)
- OBS存储启用服务器端加密(SSE-KMS)
- 微信图片下载添加Referer校验
审计日志设计:
-- MySQL审计表设计CREATETABLE`document_audit_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`user_id`bigint(20)NOTNULL,`operation_type`enum('UPLOAD','IMPORT','PASTE')NOTNULL,`document_type`varchar(20)DEFAULTNULL,`ip_address`varchar(45)NOTNULL,`user_agent`varchar(500)DEFAULTNULL,`created_at`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`),KEY`idx_user_operation`(`user_id`,`operation_type`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;
五、成本与交付
总成本明细:
项目 金额(人民币) CKEditor4授权 245,000 华为云OBS存储 预估5,000/年 信创适配测试 30,000 合计 280,000 交付成果:
- 信创兼容的文档处理插件包
- 完整的PHP后端服务代码
- 自动化测试套件(覆盖12种信创组合)
- 3年免费技术支持
六、后续优化方向
- 开发WebAssembly版本的文档解析器(提升信创环境性能)
- 增加PDF导出时的水印功能
- 实现Excel表格的交互式编辑(集成Handsontable)
方案价值:通过商业插件+定制开发,在预算内实现了全功能需求,特别针对信创环境进行了深度优化,为后续1000+政府客户项目提供了可复用的技术方案,预计可节省60%以上的重复采购成本。
复制插件
说明:此教程以CKEditor4.x为例,使用其他编辑器的查看对应教程。
将下列文件夹复制到项目中
/WordPaster
/ckeditor/plugins/imagepaster
/ckeditor/plugins/netpaster
/ckeditor/plugins/pptpaster
/ckeditor/plugins/pdfimport
上传插件
上传插件文件夹
将imagepaster,netpaster文件夹上传到现有项目ckeditor/plugins目录中
在工具栏中增加插件按钮
引用js
初始化控件
WordPaster.getInstance({//上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:api,//为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:"",//设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:"file",//提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:'',Cookie:'PHPSESSID='});//加载控件配置上传接口
注意
1.如果接口字段名称不是file,请配置FileFieldName。ueditor接口中使用的upfile字段
点击查看详细教程
配置ImageMatch
用于匹配JSON数据,
点击查看详细教程
配置ImageUrl
用于为图片增加域名前缀
点击查看详细教程
配置Session
如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:点击查看详细教程
说明
1.请先测试您的接口:点击查看详细教程
功能演示
编辑器界面
导入Word文档,支持doc,docx
导入Excel文档,支持xls,xlsx
粘贴Word
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
Word转图片
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入PDF
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PPT
一键导入PPT文件,并将PPT转换成图片上传到服务器中。
上传网络图片
一键自动上传网络图片,自动下载远程服务器图片,自动上传远程服务器图片
下载示例
点击下载完整示例