汽车网站建设可行性分析西安建设工程信息网新平台
汽车网站建设可行性分析,西安建设工程信息网新平台,微餐饮网站建设用途,wordpress post slug我#xff0c;一个被Word导出需求折腾到头秃的安徽JAVA仔#xff0c;想和你说点掏心窝子的话
咱先唠唠这事儿啊——最近接了个CMS企业官网外包#xff0c;客户是做本地机械制造的#xff0c;老板人特实在#xff0c;但提需求时差点把我CPU干烧了#xff1a;“小同志啊// 注册自定义插件wordImportUE.registerUI(wordImport,function(editor,uiName){constbtnnewUE.ui.Button({name:uiName,title:导入Word/粘贴公众号内容,cssRules:background-image: url(./plugins/wordimport/icon.png) !important;,onclick:(){// 触发文件选择或粘贴handleWordImport(editor);}});returnbtn;});});// 处理导入逻辑粘贴或选文件functionhandleWordImport(editor){// 方案1监听粘贴事件用户直接CtrlVdocument.addEventListener(paste,async(e){constitemse.clipboardData.items;for(leti0;iitems.length;i){if(items[i].type.indexOf(image)!-1){// 粘贴图片直接上传OSSconstimgUrlawaituploadImageToOSS(items[i].getAsFile());editor.execCommand(insertimage,{src:imgUrl});}elseif(items[i].typetext/html){// 粘贴HTML内容含样式consthtmlitems[i].getAsFile().getAsText();editor.execCommand(inserthtml,html);}}});// 方案2选择本地文件用户点击按钮选Word/PDF等constinputdocument.createElement(input);input.typefile;input.accept.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf;input.onchangeasync(e){constfilee.target.files[0];constresawaitfetch(/api/doc/import,{method:POST,body:JSON.stringify({file:file.name,content:awaitreadFile(file)}),headers:{Content-Type:application/json}});constdataawaitres.json();editor.setContent(data.html);// 插入解析后的内容};input.click();}// 辅助函数读取文件内容functionreadFile(file){returnnewPromise((resolve){constreadernewFileReader();reader.onload(e)resolve(e.target.result);reader.readAsArrayBuffer(file);// Word等二进制文件用ArrayBuffer});}后端Java解析文档上传OSSLatex转换前端搞定了后端才是硬仗。客户要保留图片、样式甚至Latex公式得靠Java解析文档。我挑了这几个工具Apache POI解析Word/Excel/PPT虽然处理复杂格式有点费劲但胜在开源PDFBox解析PDF对付文字和图片还行公式得靠OCR但客户没提OCR先凑合阿里云OSS SDK上传图片这步简单官方文档写得明白SnuggleTeXLatex转MathML专门干这活的小众库支持大部分公式语法。关键代码后端Java接口// Word导入接口Spring MVCPostMapping(/api/doc/import)ResponseBodypublicMapimportWord(RequestBodyImportRequestrequest){MapresnewHashMap();try{// 读取Word文件这里以.docx为例XWPFDocumentdocnewXWPFDocument(newFileInputStream(request.getFile()));// 提取正文内容含样式StringBuilderhtmlnewStringBuilder();for(XWPFParagraphp:doc.getParagraphs()){// 处理字体、颜色、字号等样式StringstyleparseParagraphStyle(p);html.append();// 处理段落中的文本和图片for(XWPFRunrun:p.getRuns()){if(run.getPictures()!null){// 提取图片并上传OSSfor(XWPFPicturepic:run.getPictures()){byte[]bytespic.getPictureData().getData();StringimgNameUUID.randomUUID().png;StringossUrlossService.uploadToOSS(bytes,imgName);// 调用OSS上传html.append();}}else{// 普通文本保留颜色、加粗等html.append(run.getText(0));}}html.append();}html.append();// 处理Latex公式假设文档中用${latex}标记StringprocessedHtmllatexToMathML(html.toString());res.put(code,200);res.put(html,processedHtml);}catch(Exceptione){res.put(code,500);res.put(msg,导入失败e.getMessage());}returnres;}// Latex转MathML工具方法调用SnuggleTeXprivateStringlatexToMathML(Stringhtml){SnuggleEngineenginenewSnuggleEngine();SnuggleSessionsessionengine.createSession();// 替换${latex}为MathMLPatternpatternPattern.compile(\\$\\{(.*?)\\});Matchermatcherpattern.matcher(html);StringBuffersbnewStringBuffer();while(matcher.find()){Stringlatexmatcher.group(1);try{session.parseInput(latex);StringmathMLsession.buildXMLString();matcher.appendReplacement(sb,mathML);}catch(Exceptione){matcher.appendReplacement(sb,latex);// 转换失败保留原Latex}}matcher.appendTail(sb);returnsb.toString();}// OSS上传工具类简化版ServicepublicclassOssService{Value(${oss.accessKeyId})privateStringaccessKeyId;Value(${oss.accessKeySecret})privateStringaccessKeySecret;Value(${oss.endpoint})privateStringendpoint;Value(${oss.bucketName})privateStringbucketName;publicStringuploadToOSS(byte[]bytes,StringfileName){OSSossClientnewOSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);ossClient.putObject(bucketName,news/fileName,newByteArrayInputStream(bytes));DateexpirationossClient.generatePresignedUrl(bucketName,news/fileName,newDate(System.currentTimeMillis()3600*1000)).getExpiration();returnossClient.generatePresignedUrl(bucketName,news/fileName,expiration).toString();}}遇坑记公式和图片的那些事儿刚开始搞Latex转换时客户发来的公式全是乱码——原来他们用了MathTypeSnuggleTeX对MathType的私有语法支持一般。后来翻了翻MathType文档发现它能导出Latex标准语法于是让客户那边稍微调整了下公式输入习惯小插曲但也算解决了。图片上传更头疼Word里的图片可能是emf格式Windows专属直接转PNG会糊。后来用了Apache POI的XWPFPictureData配合ImageIO转成JPEG清晰度总算达标。最后唠唠这钱赚得值现在这插件在我本地跑得贼溜客户那帮老会计用着直拍大腿“比俺们当年手敲快多了” 预算嘛没超680——OSS流量费客户自己出开源工具不花钱就买了几杯奶茶提神毕竟凌晨三点改代码不是人干的。对了我建了个QQ群223813913专门拉想接这类外包的兄弟。群里天天有人问“怎么解析Excel公式”“PDF里的表格咋提取”我这种“过来人”偶尔指点两句顺便接点私活。最近还在搞活动新人加群送红包推荐客户提20%提成——上个月有个兄弟推荐了个政府网站项目直接拿了8000块提成比我写代码来钱快多了要是你也受够了“客户要啥我做啥”的苦想找个“技术变现”的路子不妨进群聊聊。咱不画饼就唠实在的——代码怎么写钱怎么赚群里全给你扒拉明白最后小声bb要是群里有人能搞出MathType完美解析的插件我分他一半提成复制插件目录引入插件文件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]]初始化控件varposwindow.location.href.lastIndexOf(/);varapi[window.location.href.substr(0,pos1),asp/upload.asp].join();WordPaster.getInstance({//上传接口http://www.ncmem.com/doc/view.aspx?idd88b60a2b0204af1ba62fa66288203edPostUrl:api,//为图片地址增加域名http://www.ncmem.com/doc/view.aspx?id704cd302ebd346b486adf39cf4553936ImageUrl:,//设置文件字段名称http://www.ncmem.com/doc/view.aspx?idc3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:file,//提取图片地址http://www.ncmem.com/doc/view.aspx?id07e3f323d22d4571ad213441ab8530d1ImageMatch:});//加载控件注意如果接口字段名称不是file请配置FileFieldName。ueditor接口中使用的upfile字段点击查看详细教程配置ImageMatch匹配图片地址如果服务器返回的是JSON则需要通过正则匹配ImageMatch:,点击参考链接配置ImageUrl为图片地址增加域名如果服务器返回的图片地址是相对路径可通过此属性添加自定义域名。ImageUrl:,点击查看详细教程配置SESSION如果接口有权限验证登陆验证SESSION验证请配置COOKIE。或取消权限验证。参考http://www.ncmem.com/doc/view.aspx?id8602DDBF62374D189725BF17367125F3效果编辑器界面导入Word文档,支持doc,docx导入Excel文档,支持xls,xlsx粘贴Word一键粘贴Word内容自动上传Word中的图片保留文字样式。Word转图片一键导入Word文件并将Word文件转换成图片上传到服务器中。导入PDF一键导入PDF文件并将PDF转换成图片上传到服务器中。导入PPT一键导入PPT文件并将PPT转换成图片上传到服务器中。上传网络图片下载示例点击下载完整示例