1. 问题拆解:CAD图纸进TinyMCE,卡在哪了
1.1 你遇到的“模糊”问题,本质是剪贴板格式不匹配
先讲一个我实际经历过的场景。某芯片制造企业要把工艺工程师的PCB版图、封装基板图和治具装配图统一归档到内部文档系统里,UI那边搭了一套基于TinyMCE的Web编辑器。刚开始大家想得很简单:让工程师在AutoCAD里选中图形,Ctrl+C复制,然后在网页编辑器里Ctrl+V粘贴,完事。结果真的跑起来之后,工艺部那边炸了锅。
粘贴进TinyMCE的图,要么是一张白底黑线的位图,放大两倍就全是锯齿;要么干脆什么都粘不进去。工程师反馈说“图纸糊了,不能用”。这个“糊”字背后,其实是Windows剪贴板数据格式和浏览器粘贴机制之间的矛盾。
Windows剪贴板支持非常多种数据格式,AutoCAD复制一个对象时,会同时往剪贴板里塞好几种格式:增强图元文件(EMF)、位图(BMP/DIB)、甚至OLE对象数据。但浏览器里的JavaScript在监听paste事件时,出于安全沙箱限制,根本拿不到Native格式里的EMF或OLE数据,只能通过e.clipboardData.getData('text/html')、getData('text/plain')或者getData('image/png')之类的接口去读。TinyMCE在粘贴时对图片类内容做了兼容处理,最后落到编辑器里的往往是位图格式。位图是像素阵列,CAD图纸里那些0.05mm线宽的细导线,一旦被像素化,在审批文档里就看不清了,打印成PDF更是没法用。
再说直白一点:CAD复制出来的东西里,矢量信息还存在,但浏览器这层“翻译”只拿走了位图版本,把矢量信息丢掉了。这不是TinyMCE的问题,是整个Web安全模型决定了JS不可能读取用户在桌面应用里复制的原生超级数据,除非你自己写一个带原生代码的浏览器插件。对大多数企业来说,这条路直接被堵死。
1.2 为什么芯片制造企业特别在意“矢量”
很多行业把图纸传上去能看个大概就满足了,但芯片制造企业不行。Fab厂里的设备工程师、工艺整合工程师每天看的版图包含“光刻层、金属层、过孔层”这种复合图形,一条细线可能代表一条走线,一旦在文档里变成模糊像素,审批人根本判断不了这个标注是否压到了其他图层。
还有打印和归档需求。芯片企业的工程变更单(ECN)、偏差申请(NCR)、作业指导书(SOP)都要过严格的审批流,最后要转成PDF归档。如果原始图纸是位图,打印出来线宽会不一致,细线可能直接消失;如果保留矢量,打印时无论多大倍率,线条始终清晰,注释文字还能被检索。这是质量体系里的硬性要求,不是“好不好看”的问题。
另外,还有一个容易被忽视的点:版本比对。芯片企业经常需要对比两个版本的版图差异,比如客户更新了焊盘尺寸,工程师需要在Web文档里直接测量两版的间距。位图没法测量,矢量SVG可以嵌入JavaScript测量工具,或者至少用户在浏览器里放大后能肉眼数栅格。所以“矢量输出”四个字,对企业文档系统来说,不是锦上添花,而是基本盘。
1.3 项目目标:一张图纸在Web文档里该长什么样
基于上面的需求,我在项目一开始就把成功标准定成了下面四条:
- 粘贴或上传到TinyMCE里的图纸,必须保持矢量属性,放大后线条不糊。
- 图纸里的文字块可选中、可搜索,至少视觉上不能变成“一团曲线”。
- 图纸体积要可控,不能让一个10MB的DWG图纸转出100MB的网页。
- 与TinyMCE现有编辑流程兼容,工程师能继续用熟悉的CAD复制操作,而不是去学一套新工具。
现在回头看,第一条和第二条是决定技术路线的关键。如果我们只做“能看”,完全可以让工程师导出PNG再往网页里贴,但那样就彻底失去了矢量的灵魂。所以最终方案,一定是围绕SVG(可缩放矢量图形)来做。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方案选型:从粘贴到上传,是被逼出来的最优解
2.1 为什么不能直接改写TinyMCE粘贴处理
最开始,我试图在TinyMCE的paste_preprocess回调里做文章,想通过拦截粘贴事件,把剪贴板里的图转成SVG。试了一圈发现,这条路根本走不通。浏览器只能拿到image/png格式的位图,拿不到EMF、DXF、DWG任何矢量源。没有源数据,前端再怎么处理都是无米之炊。
有人可能会说,那我写一个ActiveX控件或者NPAPI插件,像老式OA系统那样嵌入到浏览器里读取剪贴板。这个方案在技术上可行,但现在是Web时代,Chrome和Edge都放弃了NPAPI,ActiveX更是IE时代的遗物。芯片企业信息安全部门还会额外卡一道:不准装浏览器插件。所以这个方向只能放弃。
也有人提出用Java Applet,这个我连想都没想,早就被淘汰了。
那是不是就完全没办法实现“Ctrl+C到网页粘贴”了?也不是,但需要换一个角度:我们让用户在CAD里复制后,通过一个桌面小工具把矢量数据导出来,再粘贴到网页里。不过这里又多了一个工具链,工程师不愿意用
