乐于分享
好东西不私藏

CAD插件每周挑战—快速文字识别工具V1.0 (命令:KSWZSB)

CAD插件每周挑战—快速文字识别工具V1.0 (命令:KSWZSB)

AutoCAD 神器|截图 OCR 插件!PDF 转 CAD 文字秒变可编辑

哈喽各位 CAD 设计师、工程小伙伴们👷‍♀️👷‍♂️日常画图是不是被这些问题逼疯:扫描 PDF 转 CAD 后,文字全变成多段线无法编辑,只能手动抄录?第三方截图识别文字又不够智能。今天给大家带来一款基于Tesseract 引擎的 AutoCAD OCR 插件,精准解决PDF 转 CAD 文字无法编辑行业痛点,兼容 AutoCAD2016及以上版本,便携免安装,识别精度拉满!


一、插件核心功能✨

本插件基于 Tesseract 4.4.1 引擎深度优化,专为 CAD 工程图纸开发,PDF 转 CAD 文字复活为核心亮点,全功能覆盖:

  1. PDF 转 CAD 文字一键复活(核心王牌)
    彻底解决 PDF 图纸转 CAD 后,文字变为图片、栅格化、无法编辑的问题,框选文字即可识别,直接生成 CAD 可编辑文字,告别手动重输!
  2. 1、一键框选精准截图
    系统级无偏移截图,框选即截,适配全屏、局部文字区域,兼容 CAD 界面、PDF 图纸任意位置。
  3. 2、超高精度全字符识别
    支持简体中文、英文、数字、中英文标点符号、CAD 工程数学符号(±°φ×÷≤≥)全识别,传统 OCR 识别不准的问题全部解决。
  4. 3、智能文本格式化
    自动清理识别结果中的多余空行、空白行,插入 CAD 后排版整洁,无间隔空行。
  5. 4、便携化零配置设计
    抛弃繁琐路径配置,tessdata语言库直接与插件 DLL 放在同一文件夹,任意目录、U 盘即插即用,不依赖 CAD 安装目录。
  6. 5、一键生成可编辑文字
    识别完成后,点击图纸任意位置,直接生成 CAD 多行文字(MText),全程无需复制粘贴,可随意修改编辑。
  7. 6、纯绿色无报错
    修复所有编译 / 引用冲突,100% 兼容 AutoCAD2016及以上版本,稳定运行不闪退。

二、插件使用场景💡

这款插件是 CAD 办公效率神器,PDF 转 CAD 文字修复为核心场景,覆盖 100% 工程绘图需求:

  1. 1、PDF 转 CAD 图纸文字修复(最强场景)
    PDF 图纸转 CAD 后文字栅格化、无法编辑,插件一键识别生成可编辑文字,彻底告别手动重绘文字。
  2. 2、扫描版 PDF 图纸文字提取
    纸质图纸扫描的 PDF 文件,无需手动抄写,框选文字直接识别插入,节省 80% 录入时间。
  3. 3、现场拍照图纸快速复现
    工地 / 现场拍照的图纸文字,截图识别后一键生成 CAD 可编辑文本。
  4. 4、旧图纸文字修改复用
    老旧图纸无法编辑的文字,截图识别后重新生成可修改文本。
  5. 5、标书 / 说明文字快速导入
    外部文档文字截图,直接识别插入 CAD,跨平台文字复用。

三、插件使用注意事项⚠️

为保证插件最佳效果,使用前务必注意以下几点:

  1. 1、环境要求
    支持 AutoCAD2016 及以上版本,依赖.NET Framework 4.5(系统默认已安装)。
  2. 2、文件放置规则(核心)
    插件 DLL 和 tessdata 文件夹必须放在同一目录,不可拆分!
    任意文件夹/├─ 29、快速文字识别工具V1.0 (命令:KSWZSB).dll(插件文件)└─ tessdata/(语言库文件夹)   ├─ chi_sim.traineddata(中文)   └─ eng.traineddata(英文)
    1. 3、识别优化技巧
    ✔️ CAD 中滚轮放大文字后再框选,文字越大识别率越高;
  3. ✔️ 优先框选单行文字,识别精度远高于多行;
  4. ✔️ 保持 CAD白底黑字默认背景,识别效果最佳;
  5. ✔️ 框选时完整包含文字 / 标点,不要截断内容。
  6. 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, 00, 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}");                        // 插入CAD                        PromptPointOptions 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, 00, 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目录下的 tessdata            string 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. 插入文字到CAD        privatevoidInsertTextToCad(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

请在微信客户端打开

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » CAD插件每周挑战—快速文字识别工具V1.0 (命令:KSWZSB)

猜你喜欢

  • 暂无文章