news 2026/6/15 22:08:15

军工装备管理系统TinyMCE4导入PDF图纸出现字体缺失怎么办?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
军工装备管理系统TinyMCE4导入PDF图纸出现字体缺失怎么办?

项目需求技术评估与实施方案

一、需求背景分析

作为北京某国企项目负责人,我们当前面临在企业网站后台管理系统中集成Word粘贴、文档导入和微信公众号内容处理功能的迫切需求。该需求源于政府项目对文档处理能力提升的要求,同时需要满足信创国产化环境的兼容性。

二、技术需求明确

核心功能需求

  1. Word粘贴功能:支持从Word复制内容粘贴到编辑器,自动上传图片至服务器
  2. 文档导入功能:支持Word/Excel/PPT/PDF导入并保留样式和图片
  3. 微信公众号内容处理:自动下载文章图片并上传至服务器

技术约束条件

  • 前端框架:Vue2-cli + TinyMCE 5
  • 后端技术:JSP框架
  • 数据库:MySQL
  • 服务器:阿里云ECS + OSS
  • 信创兼容性:多种国产OS、CPU和浏览器
  • 预算:88万以内
  • 授权模式:源代码买断

三、市场调研与厂商评估

已评估厂商

  1. 金山WPS

    • 仅提供使用授权,无源代码出售
    • 单个用户授权模式,不适合我们大规模项目需求
    • 报价超出预算范围
  2. 永中Office

    • 同样不提供源代码买断
    • 授权模式按用户数计费
    • 无法满足自主可控要求

替代方案寻找

经过深入调研,发现以下两类解决方案:

  1. 基于开源方案二次开发

    • Mammoth.js + TinyMCE插件
    • 自主开发图片上传处理模块
    • 优点:成本可控,完全自主
    • 缺点:开发周期长,样式保留不完整
  2. 专业文档处理中间件

    • 国内新兴文档处理技术服务商
    • 提供SDK和API集成
    • 部分厂商提供源代码授权

四、技术方案选型

最终选择专业文档处理中间件方案,经过多轮技术对比,确定与"荆门泽优软件有限公司"合作,其产品特点:

  1. 完全兼容信创环境

    • 提供各类国产OS、CPU和浏览器兼容证明
    • 已完成与麒麟、统信等系统的适配
  2. 功能全面

    • 支持Word粘贴保留样式
    • 完整文档导入功能,支持Word,Excel,PowerPoint(PPT),PDF,微信公众号
    • 微信公众号内容处理
  3. 授权模式灵活

    • 提供源代码买断方案(报价75万)
    • 包含编译打包和开发培训
    • 5个以上央企合作案例

五、技术集成方案

前端集成方案(TinyMCE插件开发)

// TinyMCE插件:wordpaste.jstinymce.PluginManager.add('wordpaste',function(editor){// 添加工具栏按钮editor.ui.registry.addButton('wordpaste',{icon:'paste',tooltip:'粘贴Word内容',onAction:function(){// 处理粘贴逻辑handleWordPaste(editor);}});// 处理Word粘贴functionhandleWordPaste(editor){editor.on('paste',function(e){// 检测是否为Word内容if(isWordContent(e.clipboardData)){e.preventDefault();processWordContent(e.clipboardData,editor);}});}// 处理Word内容asyncfunctionprocessWordContent(clipboardData,editor){try{consthtml=awaitextractWordHtml(clipboardData);constprocessedHtml=awaituploadImages(html);editor.insertContent(processedHtml);}catch(error){console.error('Word粘贴处理失败:',error);}}});

后端处理方案(JSP实现)

<%@ page import="com.xx.docprocessor.*" %> <%@ page import="java.io.*" %> <% // 文档导入处理Servlet public class DocImportServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传文件 Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); InputStream fileContent = filePart.getInputStream(); // 文档处理 DocProcessor processor = new DocProcessor(); DocResult result = processor.process(fileContent, fileName); // 图片上传OSS for (DocImage image : result.getImages()) { String ossUrl = OSSUtils.upload(image.getData(), image.getFileName()); result.replaceImageUrl(image.getId(), ossUrl); } // 返回处理后的HTML response.setContentType("text/html"); response.getWriter().write(result.getHtml()); } } // OSS上传工具类 public class OSSUtils { public static String upload(byte[] data, String fileName) { // 创建OSSClient实例 OSS ossClient = new OSSClientBuilder().build( "yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret"); try { // 生成唯一文件名 String objectName = "docs/" + UUID.randomUUID() + getFileExtension(fileName); // 上传文件 ossClient.putObject("yourBucketName", objectName, new ByteArrayInputStream(data)); // 返回访问URL return "https://yourBucketName.yourEndpoint/" + objectName; } finally { ossClient.shutdown(); } } } %>

六、部署实施方案

1. 开发环境配置

  • 在Eclipse JEE中配置SDK开发环境
  • 集成文档处理中间件SDK
  • 配置Maven依赖管理

2. 测试验证流程

  1. 单元测试:验证各功能模块
  2. 集成测试:与现有系统集成测试
  3. 兼容性测试:各类信创环境测试
  4. 性能测试:大文档处理压力测试

3. 部署流程

  1. 前端:

    • 集成TinyMCE插件到Vue项目
    • 打包部署静态资源
  2. 后端:

    • 部署文档处理服务
    • 配置OSS连接参数
    • 发布JSP应用

七、项目风险管理

  1. 兼容性风险

    • 提前获取各类信创环境进行测试
    • 与厂商签订兼容性保障协议
  2. 性能风险

    • 对大文档处理设置超时机制
    • 实现异步处理流程
  3. 安全风险

    • 文档内容安全扫描
    • 图片上传格式校验
    • OSS访问权限严格控制

八、项目交付物

  1. 技术文档

    • 系统设计说明书
    • API接口文档
    • 部署手册
    • 用户操作手册
  2. 培训材料

    • 开发培训PPT
    • 示例代码库
    • 常见问题解答
  3. 合规文件

    • 软件著作权证书
    • 信创环境兼容证明
    • 源代码移交清单

九、后续升级规划

  1. 短期(3个月内)

    • 优化文档处理性能
    • 增加更多文档格式支持
  2. 中期(6个月内)

    • 集成更多国产办公软件
    • 实现文档协同编辑功能
  3. 长期(1年内)

    • 构建完整文档中台
    • 实现AI文档智能处理

通过本方案实施,我们将满足政府项目对文档处理的全面需求,同时符合信创国产化要求,实现技术自主可控,为未来项目积累可复用的文档处理能力。

复制插件

安装jquery

npm install jquery

在组件中引入

// 引入tinymce-vueimportEditorfrom'@tinymce/tinymce-vue'import{WordPaster}from'../../static/WordPaster/js/w'import{zyOffice}from'../../static/zyOffice/js/o'import{zyCapture}from'../../static/zyCapture/z'

添加工具栏

//添加导入excel工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importExcel()}varregister$1=function(editor){editor.ui.registry.addButton('excelimport',{text:'',tooltip:'导入Excel文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('excelimport',{text:'',tooltip:'导入Excel文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('excelimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加word转图片工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importWordToImg()}varregister$1=function(editor){editor.ui.registry.addButton('importwordtoimg',{text:'',tooltip:'Word转图片',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('importwordtoimg',{text:'',tooltip:'Word转图片',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('importwordtoimg',function(editor){Buttons.register(editor);});}Plugin();}());//添加粘贴网络图片工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().UploadNetImg()}varregister$1=function(editor){editor.ui.registry.addButton('netpaster',{text:'',tooltip:'网络图片一键上传',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('netpaster',{text:'',tooltip:'网络图片一键上传',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('netpaster',function(editor){Buttons.register(editor);});}Plugin();}());//添加导入PDF按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().ImportPDF()}varregister$1=function(editor){editor.ui.registry.addButton('pdfimport',{text:'',tooltip:'导入pdf文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('pdfimport',{text:'',tooltip:'导入pdf文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('pdfimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加导入PPT按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importPPT()}varregister$1=function(editor){editor.ui.registry.addButton('pptimport',{text:'',tooltip:'导入PowerPoint文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('pptimport',{text:'',tooltip:'导入PowerPoint文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('pptimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加导入WORD按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importWord()}varregister$1=function(editor){editor.ui.registry.addButton('wordimport',{text:'',tooltip:'导入Word文档',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('wordimport',{text:'',tooltip:'导入Word文档',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('wordimport',function(editor){Buttons.register(editor);});}Plugin();}());//添加WORD粘贴按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');varico="http://localhost:8080/static/WordPaster/plugin/word.png"functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).PasteManual()}varregister$1=function(editor){editor.ui.registry.addButton('wordpaster',{text:'',tooltip:'Word一键粘贴',onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem('wordpaster',{text:'',tooltip:'Word一键粘贴',onAction:function(){selectLocalImages(editor)}});};varButtons={register:register$1};functionPlugin(){global.add('wordpaster',function(editor){Buttons.register(editor);});}Plugin();}());

在线代码:

添加插件

// 插件plugins:{type:[String,Array],// default: 'advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars'default:'autoresize code autolink autosave image imagetools paste preview table powertables'},

点击查看在线代码

初始化组件

// 初始化WordPaster.getInstance({// 上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:'http://localhost:8891/upload.aspx',// 为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:'http://localhost:8891{url}',// 设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:'file',// 提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:''})

在页面中引入组件

功能演示

编辑器

在编辑器中增加功能按钮

导入Word文档,支持doc,docx

导入Excel文档,支持xls,xlsx

粘贴Word

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

Word转图片

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

导入PDF

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

导入PPT

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

上传网络图片

一键自动上传网络图片。

下载示例

点击下载完整示例

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:23:15

【2026】 LLM 大模型系统学习指南 (51)

机器学习模型的可解释性&#xff08;上&#xff09;&#xff1a;打开 AI 黑盒的入门指南机器学习模型常被称作 “黑盒”—— 输入数据就能得到结果&#xff0c;但背后 “为什么这么判断” 却无从知晓。而可解释性机器学习&#xff08;Explainable ML, XAI&#xff09; 的核心&a…

作者头像 李华
网站建设 2026/6/15 20:12:07

基于改进粒子群算法的园区综合能源优化调度:电动汽车的新舞台

MATLAB代码&#xff1a;基于改进粒子群算法的含电动汽车参与园区综合能源优化调度 关键词&#xff1a;电动汽车 改进粒子群 综合能源 优化调度 园区 参考文档&#xff1a;《含电动汽车的区域综合能源系统优化调度研究》第3章&#xff1a;复现 仿真平台&#xff1a;MATLAB 主要…

作者头像 李华
网站建设 2026/6/15 13:40:16

别再瞎找了!本科生专属AI论文软件 —— 千笔·专业论文写作工具

你是否曾为论文选题发愁&#xff0c;绞尽脑汁却找不到方向&#xff1f;是否在深夜面对空白文档&#xff0c;大脑一片空白&#xff0c;无从下笔&#xff1f;又或者反复修改却总对表达不满意&#xff0c;查重率居高不下&#xff1f;这些困扰&#xff0c;是无数本科生在论文写作路…

作者头像 李华
网站建设 2026/6/15 14:39:30

亲测好用 8个降AI率软件降AIGC网站:本科生降AI率全维度测评与推荐

在当前高校论文写作日益依赖AI辅助的背景下&#xff0c;如何有效降低AIGC率、去除AI痕迹&#xff0c;同时保持论文的逻辑性和语义通顺&#xff0c;成为许多本科生面临的重要课题。随着AI生成内容检测技术的不断升级&#xff0c;传统的写作方式已难以满足查重和原创性的双重要求…

作者头像 李华
网站建设 2026/6/15 0:02:24

改稿速度拉满,AI论文平台 千笔·专业论文写作工具 VS 云笔AI

随着人工智能技术的迅猛迭代与普及&#xff0c;AI辅助写作工具已逐步渗透到高校学术写作场景中&#xff0c;成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生&#xff0c;开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…

作者头像 李华
网站建设 2026/6/15 12:41:34

人工智能应用- 语言处理:03. 拼凑法:剪贴板式的诗人

最早的尝试往往借助现有诗句素材&#xff0c;把它们“打散”“重组”。例如把一千首古诗拆成单句、短语、词语&#xff0c;再组合成“新诗”。这种方法的好处是结果读起来“似曾相识”&#xff0c;不会有太多字词错误。但缺点是语义逻辑常常混乱&#xff0c;意境杂糅不清&#…

作者头像 李华