> 技术文档 > wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

wangEditor前端网页编辑器导入Word文档图文混排怎么处理?


Word 导入产品选型与开发全记录

作为集团公司负责此次项目推进的技术人员,面对集团内多子公司共有的 Word 导入需求,我肩负着寻找合适产品并推动开发落地的重任。该需求核心是实现 Word 图片自动导入且上传至服务器,同时保留 Word 文档样式,编辑器采用 wangEditor,前端基于 vue2 - cli 框架,后端为 SpringBoot,数据库选用 MySQL,服务器部署在阿里云,还需支持信创国产化软硬件环境(操作系统涵盖统信 UOS、中标麒麟、银河麒麟)。领导明确要求产品成熟、开放源代码,以便后续由公司研发部门接手,并提供 7*24 小时在线技术支持服务。以下是我详细的查找与开发过程记录。

产品查找与评估

初步筛选

我首先在各大技术论坛、开源社区以及专业软件平台上进行广泛搜索,重点关注那些支持 Word 导入且具备图片处理功能的产品。经过初步筛选,发现了几款有一定潜力的产品,如 [产品 A 名称]、[产品 B 名称]和 [产品 C 名称]。

深入评估

  1. 功能匹配度
    • 产品 A:功能较为全面,支持 Word 文档的导入,并且能够识别文档中的图片。但在图片自动上传服务器这一功能上,需要额外进行二次开发,增加了项目的复杂度和时间成本。同时,对于 Word 文档样式的保留,在某些复杂格式下会出现偏差,无法完全满足集团业务多样化的需求。
    • 产品 B:在图片处理方面表现出色,能够实现图片的自动上传,并且上传过程稳定可靠。然而,它与 wangEditor 编辑器的集成存在一定问题,需要进行大量的适配工作。而且,该产品对于信创国产化软硬件环境的支持不够完善,在部分国产操作系统上会出现兼容性问题。
    • 产品 C:这款产品给我留下了深刻印象。它不仅支持 Word 图片自动导入和上传到服务器,还能高度保留 Word 文档的样式,包括字体、字号、颜色、大小等。与 wangEditor 编辑器的集成也相对简单,提供了详细的集成文档和示例代码。更重要的是,它对信创国产化软硬件环境有良好的支持,经过测试在统信 UOS、中标麒麟、银河麒麟等操作系统上都能稳定运行。
  2. 源代码开放情况
    产品 C 提供了完整的源代码,这完全符合领导的要求。公司研发部门可以基于源代码进行二次开发和定制化,以满足不同子公司的个性化需求。
  3. 技术支持服务
    与产品 C 的供应商进行了深入沟通,了解到他们提供 7*24 小时在线技术支持服务。这对于集团这样业务繁忙、对系统稳定性要求高的企业来说非常重要,能够在遇到问题时及时得到解决,减少对业务的影响。

综合以上评估,最终决定选择产品 C 作为此次项目的核心产品。

开发过程

环境搭建

  1. 前端环境
    使用 vue2 - cli 框架搭建前端项目结构,安装 wangEditor 编辑器以及产品 C 相关的前端依赖库。配置好开发环境和生产环境的参数,确保项目能够正常运行。
# 创建 vue2 项目vue init webpack word - import - project# 进入项目目录cd word - import - project# 安装 wangEditornpm install wangeditor --save# 安装产品 C 前端依赖(假设为 product - c - frontend)npm install product - c - frontend --save
  1. 后端环境
    基于 SpringBoot 搭建后端服务,配置 MySQL 数据库连接,集成产品 C 的后端 SDK。在阿里云服务器上部署后端服务,确保服务能够正常启动和访问。
// SpringBoot 启动类示例import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class WordImportApplication { public static void main(String[] args) { SpringApplication.run(WordImportApplication.class, args); }}

功能集成与开发

  1. Word 导入功能集成
    根据产品 C 提供的文档,在前端页面中添加 Word 导入按钮,并绑定相应的事件处理函数。在事件处理函数中,调用产品 C 的前端 API 实现 Word 文档的读取和解析。
import E from \'wangeditor\';import { importWord } from \'product - c - frontend\'; // 假设产品 C 前端导出 importWord 方法export default { mounted() { this.editor = new E(\'#editor\'); this.editor.create(); }, methods: { handleWordImport(event) { const file = event.target.files[0]; if (file) { importWord(file).then(html => { this.editor.txt.html(html); }); } } }};
  1. 图片自动上传功能开发
    在产品 C 解析 Word 文档的过程中,拦截图片数据,并将其通过后端 API 上传到阿里云服务器。后端接收图片数据后,进行存储和处理,并返回图片的访问地址。前端将返回的地址替换到文档中相应的图片位置。
// 前端图片上传处理示例import { uploadImageToServer } from \'@/api/image\'; // 假设自定义的图片上传 API// 在产品 C 的图片处理回调中调用function handleImageUpload(imageFile) { return uploadImageToServer(imageFile).then(response => { return response.data.url; // 返回图片在服务器的访问地址 });}
// 后端图片上传接口示例import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOException;import java.util.UUID;@RestController@RequestMapping(\"/api/image\")public class ImageUploadController { private static final String UPLOAD_DIR = \"/path/to/aliyun/oss/upload/directory\"; @PostMapping(\"/upload\") public String uploadImage(@RequestParam(\"file\") MultipartFile file) { try { String originalFilename = file.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(\".\")); String newFilename = UUID.randomUUID().toString() + fileExtension; File dest = new File(UPLOAD_DIR + File.separator + newFilename); file.transferTo(dest); // 这里可以添加将文件上传到阿里云 OSS 的代码 // 返回图片的访问地址 return \"https://your - aliyun - oss - domain/\" + newFilename; } catch (IOException e) { e.printStackTrace(); return \"上传失败\"; } }}
  1. 样式保留优化
    对产品 C 解析 Word 文档样式的过程进行调试和优化,确保在不同格式的 Word 文档下都能准确保留样式。对于一些特殊的样式情况,通过自定义 CSS 样式表进行覆盖和调整。
/* 自定义样式示例 */#editor p { margin: 10px 0; line - height: 1.6;}#editor h1 { font - size: 24px; color: #333;}

测试与优化

  1. 功能测试
    对 Word 导入、图片上传和样式保留等功能进行全面测试,包括不同格式的 Word 文档、不同大小的图片以及各种复杂的样式情况。记录测试过程中发现的问题,并及时进行修复。
  2. 性能测试
    模拟多用户同时进行 Word 导入操作,测试系统的性能和稳定性。对系统的响应时间、吞吐量等指标进行监控和分析,对性能瓶颈进行优化,如采用异步上传图片、优化数据库查询等方式。
  3. 兼容性测试
    在统信 UOS、中标麒麟、银河麒麟等信创国产化操作系统上进行兼容性测试,确保系统在这些环境下能够正常运行。同时,测试在不同浏览器(包括信创国产浏览器)上的兼容性,解决可能出现的兼容性问题。

总结与展望

经过一段时间的努力,Word 导入产品已经基本开发完成,并经过了全面的测试和优化。该产品能够满足集团内多子公司的业务需求,实现了 Word 图片自动导入和上传到服务器,同时高度保留了 Word 文档的样式。在开发过程中,与产品 C 供应商的技术支持团队保持了密切沟通,及时解决了遇到的问题。

后续,将继续关注产品的运行情况,收集用户反馈,对产品进行持续优化和改进。同时,加强与研发部门的合作,不断提升产品的性能和功能,为集团的业务发展提供有力的技术支持。

复制插件文件

vue-wangEditor3
安装jquery

npm install jquery

导入组件

import E from \'wangeditor\'const { $, BtnMenu, DropListMenu, PanelMenu, DropList, Panel, Tooltip } = Eimport {WordPaster} from \'../../static/WordPaster/js/w\'import {zyCapture} from \'../../static/zyCapture/z\'import {zyOffice} from \'../../static/zyOffice/js/o\'

初始化组件

//zyCapture Buttonclass zyCaptureBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { window.zyCapture.setEditor(this.editor).Capture(); } tryChangeActive() {this.active()}}//zyOffice Buttonclass importWordBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { window.zyOffice.SetEditor(this.editor).api.openDoc(); } tryChangeActive() {this.active()}}//zyOffice Buttonclass exportWordBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { window.zyOffice.SetEditor(this.editor).api.exportWord(); } tryChangeActive() {this.active()}}//zyOffice Buttonclass importPdfBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { window.zyOffice.SetEditor(this.editor).api.openPdf(); } tryChangeActive() {this.active()}}//WordPaster Buttonclass WordPasterBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor).Paste(); } tryChangeActive() {this.active()}}//wordImport Buttonclass WordImportBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor).importWord(); } tryChangeActive() {this.active()}}//excelImport Buttonclass ExcelImportBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor).importExcel(); } tryChangeActive() {this.active()}}//ppt paster Buttonclass PPTImportBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor).importPPT(); } tryChangeActive() {this.active()}}//pdf paster Buttonclass PDFImportBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor); WordPaster.getInstance().ImportPDF(); } tryChangeActive() {this.active()}}//importWordToImg Buttonclass ImportWordToImgBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor).importWordToImg(); } tryChangeActive() {this.active()}}//network paster Buttonclass NetImportBtn extends BtnMenu { constructor(editor) { const $elem = E.$( `
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?
`
) super($elem, editor) } clickHandler() { WordPaster.getInstance().SetEditor(this.editor); WordPaster.getInstance().UploadNetImg(); } tryChangeActive() {this.active()}}export default { name: \'HelloWorld\', data () { return { msg: \'Welcome to Your Vue.js App\' } }, mounted(){ var editor = new E(\'#editor\'); WordPaster.getInstance({ //上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203ed PostUrl: \"http://localhost:8891/upload.aspx\", License2:\"\", //为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936 ImageUrl:\"http://localhost:8891{url}\", //设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45 FileFieldName: \"file\", //提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1 ImageMatch: \'\' }); zyCapture.getInstance({ config: { PostUrl: \"http://localhost:8891/upload.aspx\", License2: \'\', FileFieldName: \"file\", Fields: { uname: \"test\" }, ImageUrl: \'http://localhost:8891{url}\' } }) // zyoffice, // 使用前请在服务端部署zyoffice, // http://www.ncmem.com/doc/view.aspx?id=82170058de824b5c86e2e666e5be319c zyOffice.getInstance({ word: \'http://localhost:13710/zyoffice/word/convert\', wordExport: \'http://localhost:13710/zyoffice/word/export\', pdf: \'http://localhost:13710/zyoffice/pdf/upload\' }) // 注册菜单 E.registerMenu(\"zyCaptureBtn\", zyCaptureBtn) E.registerMenu(\"WordPasterBtn\", WordPasterBtn) E.registerMenu(\"ImportWordToImgBtn\", ImportWordToImgBtn) E.registerMenu(\"NetImportBtn\", NetImportBtn) E.registerMenu(\"WordImportBtn\", WordImportBtn) E.registerMenu(\"ExcelImportBtn\", ExcelImportBtn) E.registerMenu(\"PPTImportBtn\", PPTImportBtn) E.registerMenu(\"PDFImportBtn\", PDFImportBtn) E.registerMenu(\"importWordBtn\", importWordBtn) E.registerMenu(\"exportWordBtn\", exportWordBtn) E.registerMenu(\"importPdfBtn\", importPdfBtn) //挂载粘贴事件 editor.txt.eventHooks.pasteEvents.length=0; editor.txt.eventHooks.pasteEvents.push(function(){ WordPaster.getInstance().SetEditor(editor).Paste(); e.preventDefault(); }); editor.create(); var edt2 = new E(\'#editor2\'); //挂载粘贴事件 edt2.txt.eventHooks.pasteEvents.length=0; edt2.txt.eventHooks.pasteEvents.push(function(){ WordPaster.getInstance().SetEditor(edt2).Paste(); e.preventDefault(); return; }); edt2.create(); }}h1, h2 { font-weight: normal;}ul { list-style-type: none; padding: 0;}li { display: inline-block; margin: 0 10px;}a { color: #42b983;}

测试前请配置图片上传接口并测试成功
接口测试
接口返回JSON格式参考

为编辑器添加按钮

 components: { Editor, Toolbar }, data () { return { editor: null, html: \'dd\', toolbarConfig: { insertKeys: { index: 0, keys: [\'zycapture\', \'wordpaster\', \'pptimport\', \'pdfimport\', \'netimg\', \'importword\', \'exportword\', \'importpdf\'] } }, editorConfig: { placeholder: \'\' }, mode: \'default\' // or \'simple\' } },

整合效果

整合效果

导入Word文档,支持doc,docx

wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

导入Excel文档,支持xls,xlsx

wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

粘贴Word

一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

Word转图片

一键导入Word文件,并将Word文件转换成图片上传到服务器中。
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

导入PDF

一键导入PDF文件,并将PDF转换成图片上传到服务器中。
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

导入PPT

一键导入PPT文件,并将PPT转换成图片上传到服务器中。
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

上传网络图片

一键自动上传网络图片,自动下载远程服务器图片,自动上传远程服务器图片
wangEditor前端网页编辑器导入Word文档图文混排怎么处理?

下载示例

点击下载完整示例