CAD插件每周挑战—快速文字识别工具V1.0 (命令:KSWZSB)
AutoCAD 神器|截图 OCR 插件!PDF 转 CAD 文字秒变可编辑
哈喽各位 CAD 设计师、工程小伙伴们👷♀️👷♂️日常画图是不是被这些问题逼疯:扫描 PDF 转 CAD 后,文字全变成多段线无法编辑,只能手动抄录?第三方截图识别文字又不够智能。今天给大家带来一款基于Tesseract 引擎的 AutoCAD OCR 插件,精准解决PDF 转 CAD 文字无法编辑的行业痛点,兼容 AutoCAD2016及以上版本,便携免安装,识别精度拉满!
一、插件核心功能✨
本插件基于 Tesseract 4.4.1 引擎深度优化,专为 CAD 工程图纸开发,PDF 转 CAD 文字复活为核心亮点,全功能覆盖:
- PDF 转 CAD 文字一键复活(核心王牌)
彻底解决 PDF 图纸转 CAD 后,文字变为图片、栅格化、无法编辑的问题,框选文字即可识别,直接生成 CAD 可编辑文字,告别手动重输! - 1、一键框选精准截图
系统级无偏移截图,框选即截,适配全屏、局部文字区域,兼容 CAD 界面、PDF 图纸任意位置。 - 2、超高精度全字符识别
支持简体中文、英文、数字、中英文标点符号、CAD 工程数学符号(±°φ×÷≤≥)全识别,传统 OCR 识别不准的问题全部解决。 - 3、智能文本格式化
自动清理识别结果中的多余空行、空白行,插入 CAD 后排版整洁,无间隔空行。 - 4、便携化零配置设计
抛弃繁琐路径配置, tessdata语言库直接与插件 DLL 放在同一文件夹,任意目录、U 盘即插即用,不依赖 CAD 安装目录。 - 5、一键生成可编辑文字
识别完成后,点击图纸任意位置,直接生成 CAD 多行文字(MText),全程无需复制粘贴,可随意修改编辑。 - 6、纯绿色无报错
修复所有编译 / 引用冲突,100% 兼容 AutoCAD2016及以上版本,稳定运行不闪退。
二、插件使用场景💡
这款插件是 CAD 办公效率神器,PDF 转 CAD 文字修复为核心场景,覆盖 100% 工程绘图需求:
- 1、PDF 转 CAD 图纸文字修复(最强场景)
PDF 图纸转 CAD 后文字栅格化、无法编辑,插件一键识别生成可编辑文字,彻底告别手动重绘文字。 - 2、扫描版 PDF 图纸文字提取
纸质图纸扫描的 PDF 文件,无需手动抄写,框选文字直接识别插入,节省 80% 录入时间。 - 3、现场拍照图纸快速复现
工地 / 现场拍照的图纸文字,截图识别后一键生成 CAD 可编辑文本。 - 4、旧图纸文字修改复用
老旧图纸无法编辑的文字,截图识别后重新生成可修改文本。 - 5、标书 / 说明文字快速导入
外部文档文字截图,直接识别插入 CAD,跨平台文字复用。
三、插件使用注意事项⚠️
为保证插件最佳效果,使用前务必注意以下几点:
- 1、环境要求
支持 AutoCAD2016 及以上版本,依赖.NET Framework 4.5(系统默认已安装)。 - 2、文件放置规则(核心)
插件 DLL 和 tessdata文件夹必须放在同一目录,不可拆分!任意文件夹/├─ 29、快速文字识别工具V1.0 (命令:KSWZSB).dll(插件文件)└─ tessdata/(语言库文件夹)├─ chi_sim.traineddata(中文)└─ eng.traineddata(英文)- 3、识别优化技巧
✔️ CAD 中滚轮放大文字后再框选,文字越大识别率越高; -
✔️ 优先框选单行文字,识别精度远高于多行; -
✔️ 保持 CAD白底黑字默认背景,识别效果最佳; -
✔️ 框选时完整包含文字 / 标点,不要截断内容。 - 4、语言包必备
tessdata
内两个语言库缺一不可,否则会出现识别失败。
四、插件使用方法📖
超简单 5 步操作,零基础也能秒会,PDF 转 CAD 文字编辑一键搞定:
步骤 1:准备文件
将编译好的插件 DLL + tessdata 文件夹放在同一个文件夹(桌面 / U 盘均可)。
步骤 2:CAD 加载插件
打开 AutoCAD2016,输入命令 NETLOAD,回车后选择插件 DLL 文件,点击加载。
步骤 3:启动插件
在 CAD 命令行输入 CAPTUREOCR,回车启动 OCR 功能。
步骤 4:框选识别区域
全屏出现半透明遮罩,按住鼠标拖拽框选需要识别的文字区域(PDF 转 CAD 后的图片文字也可框选),松开鼠标自动识别。
步骤 5:插入可编辑文字
识别完成后,命令行会显示识别结果,在图纸上点击任意位置,文字自动插入为 CAD 可编辑多行文字,完成操作!
五、延伸及自定义修改
插件源码完全开放,大家可以根据自身需求简单修改,零编程基础也能改:
1. 修改 CAD 文字高度
打开代码,找到 InsertTextToCad 方法,修改 mtext.Height = 2.5 数值即可(如改为 3、5)。
2. 调整识别语言
修改 OCR 方法中的语言参数:
-
纯英文: eng -
纯中文: chi_sim -
默认: chi_sim+eng(中文 + 英文 )
3. 调整图像增强效果
修改 EnhanceForPunctuation 方法中的放大倍数、二值化阈值,适配不同清晰度的文字。
4. 自定义命令名称
将代码中 [CommandMethod("CAPTUREOCR")] 括号内的文字改为自己习惯的命令(如OCR)。
5. 适配更高 CAD 版本
本代码兼容 AutoCAD2016~2025,仅需替换项目对应的 CAD 库文件即可。
六、插件测试环境:CAD2016及以上版本
七、插件名字:KSWZSB.dll
八、插件代码:
using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;using AcadDB = Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime;using System;using System.Drawing;using System.IO;using System.Linq;using System.Reflection;using System.Windows.Forms;using Tesseract;namespace CadScreenCapture{public class CaptureOcrTools{///<summary>/// CAD命令:KSWZSB///</summary>[CommandMethod("KSWZSB")]publicvoidCaptureAndOcr(){var doc = AcadApp.DocumentManager.MdiActiveDocument;Editor ed = doc.Editor;try{ed.WriteMessage("\n===== CAD OCR工具 =====");ed.WriteMessage("\n✅ 汉字+英文+标点+符号 \n");// 1. 框选截图区域Rectangle selectArea = GetSelectionRect();if (selectArea.Width <= 0 || selectArea.Height <= 0){ed.WriteMessage("\n已取消操作");return;}// 2. 截取图片using (Bitmap bmp = new Bitmap(selectArea.Width, selectArea.Height))using (Graphics g = Graphics.FromImage(bmp)){g.CopyFromScreen(selectArea.Left, selectArea.Top, 0, 0, bmp.Size);// 图像增强using (Bitmap cleanBmp = EnhanceForPunctuation(bmp)){ed.WriteMessage("\n正在识别...");string result = OcrWithPunctuation(cleanBmp);if (string.IsNullOrWhiteSpace(result)){ed.WriteMessage("\n❌ 未识别到文字");return;}// 清理多余空行result = CleanExtraBlankLines(result);ed.WriteMessage($"\n🎯 识别结果:\n{result}");// 插入CADPromptPointOptions ppo = new PromptPointOptions("\n请点击文字插入点:");PromptPointResult ppr = ed.GetPoint(ppo);if (ppr.Status == PromptStatus.OK){InsertTextToCad(ppr.Value, result);ed.WriteMessage("\n✅ 文字已插入CAD!");}}}}catch (System.Exception ex){ed.WriteMessage($"\n❌ 错误:{ex.Message}");}}#region 获取【插件DLL所在目录】(核心便携化)privatestringGetPluginDirectory(){// 获取当前插件DLL的文件路径string dllPath = Assembly.GetExecutingAssembly().Location;// 返回DLL所在的文件夹return Path.GetDirectoryName(dllPath);}#endregion#region 1. 系统截图框选private Rectangle GetSelectionRect(){using (Form selForm = new Form()){selForm.FormBorderStyle = FormBorderStyle.None;selForm.WindowState = FormWindowState.Maximized;selForm.BackColor = Color.Black;selForm.Opacity = 0.2;selForm.ShowInTaskbar = false;selForm.Cursor = Cursors.Cross;selForm.TopMost = true;Point startPoint = Point.Empty;Rectangle rect = Rectangle.Empty;selForm.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) startPoint = e.Location; };selForm.MouseMove += (s, e) =>{if (e.Button == MouseButtons.Left && !startPoint.IsEmpty){selForm.Invalidate();int x = Math.Min(e.X, startPoint.X);int y = Math.Min(e.Y, startPoint.Y);int w = Math.Abs(e.X - startPoint.X);int h = Math.Abs(e.Y - startPoint.Y);rect = new Rectangle(x, y, w, h);}};selForm.Paint += (s, e) => { if (!rect.IsEmpty) e.Graphics.DrawRectangle(Pens.Red, rect); };selForm.MouseUp += (s, e) => selForm.Close();selForm.ShowDialog();return rect;}}#endregion#region 2. 标点符号专属图像增强private Bitmap EnhanceForPunctuation(Bitmap original){Bitmap scaled = new Bitmap((int)(original.Width * 1.5), (int)(original.Height * 1.5));using (Graphics g = Graphics.FromImage(scaled)){g.DrawImage(original, 0, 0, scaled.Width, scaled.Height);}Bitmap gray = new Bitmap(scaled.Width, scaled.Height);for (int y = 0; y < scaled.Height; y++){for (int x = 0; x < scaled.Width; x++){Color c = scaled.GetPixel(x, y);int grayVal = (c.R + c.G + c.B) / 3;gray.SetPixel(x, y, Color.FromArgb(grayVal, grayVal, grayVal));}}scaled.Dispose();Bitmap binary = new Bitmap(gray.Width, gray.Height);for (int y = 0; y < gray.Height; y++){for (int x = 0; x < gray.Width; x++){Color c = gray.GetPixel(x, y);binary.SetPixel(x, y, c.R > 110 ? Color.White : Color.Black);}}gray.Dispose();return binary;}#endregion#region 3. 标点增强OCR(路径:DLL同目录tessdata)privatestringOcrWithPunctuation(Bitmap bitmap){// 🔥 核心:读取插件DLL目录下的 tessdatastring tessPath = Path.Combine(GetPluginDirectory(), "tessdata");using (var engine = new TesseractEngine(tessPath, "chi_sim+eng+math", EngineMode.LstmOnly)){engine.SetVariable("tessedit_pageseg_mode", "6");engine.SetVariable("textord_force_math", "1");engine.SetVariable("preserve_interword_spaces", "1");engine.SetVariable("tessedit_unrej_any_wd", "1");engine.SetVariable("language_model_penalty_punctuation", "0");engine.SetVariable("tessedit_do_invert", "0");using (var page = engine.Process(bitmap)){return page.GetText().Trim();}}}#endregion#region 4. 清理多余空行privatestringCleanExtraBlankLines(string text){if (string.IsNullOrWhiteSpace(text)) return "";text = text.Replace("\r\n", "\n").Replace('\r', '\n');var lines = text.Split('\n').Select(line => line.Trim()).Where(line => !string.IsNullOrWhiteSpace(line));return string.Join("\n", lines);}#endregion#region 5. 插入文字到CADprivatevoidInsertTextToCad(Point3d insertPoint, string text){var db = AcadApp.DocumentManager.MdiActiveDocument.Database;using (var trans = db.TransactionManager.StartTransaction()){AcadDB.BlockTable bt = trans.GetObject(db.BlockTableId, AcadDB.OpenMode.ForRead) as AcadDB.BlockTable;AcadDB.BlockTableRecord btr = trans.GetObject(bt[AcadDB.BlockTableRecord.ModelSpace], AcadDB.OpenMode.ForWrite) as AcadDB.BlockTableRecord;using (AcadDB.MText mtext = new AcadDB.MText()){mtext.Location = insertPoint;mtext.Contents = text;mtext.Height = 2.5;btr.AppendEntity(mtext);trans.AddNewlyCreatedDBObject(mtext, true);}trans.Commit();}}#endregion}}
九、插件下载:
链接: https://pan.baidu.com/s/1klzlH80dMqZGYmlQo1nQ8w
提取码: GMXY
请在微信客户端打开
夜雨聆风