
这个工具解决什么问题
展会三天,收回来一百多张名片:有的是当场拍的照片,有的是微信里对方发来的名片图片,还有几十条是聊天记录里直接粘的文字。回到工位要把它们录进 CRM —— 这意味着一个一个打开图片,把公司名、姓名、手机、邮箱、地址挨个敲一遍。眼睛在图片和表格之间来回切,敲到第五十张时开始出错:3 看成 8,邮箱里的下划线漏掉。更麻烦的是重复:同一个人在展会上见过两次,两条记录分别躺在两个表格里,谁也不知道哪条是准的。一下午过去,录了一半,还留下几十条没法核对的可疑数据。
- 原来的做法:逐张打开图片 → 手工敲进 Excel → 再复制粘贴进 CRM;微信名片要先在手机上打开、截图、再敲;重复的人靠肉眼在一百多行里比对;号码写法五花八门(+86、空格、横线混着用),导入 CRM 时又被格式校验拦下一批。
- 用这个工具:把名片照片、微信导出的 .vcf、聊天里复制的文字一起丢进窗口,点一次「开始识别」——程序用 Windows 自带的 OCR 把图片认成文字,再用规则抽出姓名/手机/固话/邮箱/公司/职位/地址/网址/微信,号码自动规范化,重复的人自动合并,最后导出成 Excel 直接打开的 CSV。填不满的字段会标黄标红,鼠标一点就能改。
- 省下来的:一百多张名片从「一下午」压到「几分钟」:机器负责认字、拆字段、去重,人只负责核对那几个标红的。
技术实现
整体分三层:Ocr.cs 只负责把一张图片变成一段文字(封装 Windows.Media.Ocr,含 EXIF 方向纠正与尺度归一);Parser.cs 只负责把一段文字变成一条联系人记录(纯函数,零界面依赖);Contacts.cs 负责去重合并与 CSV / vCard 的读写;MainForm.cs 只画控件、调度后台线程、把结果搬到屏幕上。这样分层的目的是「能自测」——内核两层不引用 System.Windows.Forms,可以脱离窗口直接断言;而 OCR 与界面这类必须真实环境才能验证的部分,隔离在两端的薄壳里。技术栈从随机抽到的 Python 改成 C#,原因只有一个:中文 OCR 要真正做到「用户不装任何东西」,最稳的路是调用 Windows 自带的 OCR 引擎,而 C# 直调 WinRT 的成本最低。
- OCR 走系统自带引擎,用户不用装任何东西:调用 Windows.Media.Ocr(Win10/11 自带的 OCR,中文系统通常已装 zh-Hans-CN 语言包),离线运行、不联网、不上传。从 .NET Framework 调 WinRT 要注意三件事:① WinRT 异步在 STA 主线程上直接 Wait 有死锁风险,所以 Recognize() 内部固定把请求丢到一条自建的 MTA 线程执行,调用方同步等结果,任何线程调用都安全;② 解码出的 SoftwareBitmap 可能是索引色或灰阶,OCR 只接受 Bgra8/Premultiplied,必须先 Convert;③ 编译期需要 Windows.winmd 与 Facades 外观程序集,但产物 exe 在用户机器上不依赖它们。
- 识别前先纠正图片:EXIF 方向 + 尺度归一:手机拍的名片带 EXIF 方向标记(PropertyItem 0x0112),不按标记旋转的话整张名片是躺倒的,OCR 全废,所以按 1~8 的值做对应 RotateFlip。尺度上把长边规范到 2000~2600 像素:太小笔画糊在一起,太大只是变慢。实测把 1200px 的图放大到 2000px 后,英文小字(邮箱、微信号)的识别率明显提升——这是先画清楚再认,而不是画糊了再插值放大。
- 号码识别:剥掉一切非数字再分类,并显式排掉日期:先把 +86、空格、横线、点、括号全部剥掉得到纯数字串,再按数字串特征判定:11 位 1[3-9] 开头=手机;13 位 86+手机号=手机(去前缀);10 位 400/800=服务号;0 开头且总长≥10=固话(用内置的 40 多个常用区号表切出区号、号码、分机);7~8 位且原文带分隔符=不带区号的固话。关键一步是先把 2026-10-13 这类日期排掉——它去掉分隔符正好 8 位,落在「不带区号固话」的判定区间里,不处理就会把名片上的日期当成电话号码。
- 针对 OCR 噪声的定向清洗:系统 OCR 对中文常按单字切分,输出成「销 售 总 监」,所以合并**汉字与汉字之间**的空格(数字之间的空格保留,用于切分号码)。全角统一转半角,但故意保留()、,、;——这四个是中文排版里的正常标点,转了公司名就跟营业执照不一致。号码里的横线常被认成 · — ~ 一,只在「数字+分隔符+数字」这种确定位置归一回横线,不会误伤正文。收紧冒号空白时只能用空格与制表符、不能用 \s,因为 \s 含换行会把两行粘成一行。
- 标签强信号优先,启发式兜底:「手机:」「公司名称:」这类标签是强信号,剥离时有三条规则:标签后面必须紧跟分隔符(否则「公司地址:北京…」会被「公司」抢先匹配);取最长的标签(「手机号码:x」要按「手机号码」剥);允许标签前有 ≤4 字符前缀(这样「联系地址:x」也能识别出「地址」)。没有标签时才走启发式:公司名靠后缀词表且排除像地址的行;姓名靠孤立的 2~4 字中文行、或职位行里剔除职位词后剩下的中文、或姓名与号码挤在同一行时的行首中文,并有一张停用词表防止把「手机」这种标签当人名。
- 去重合并与双格式导出:去重键三级:手机 → 邮箱 → 姓名+公司;三项都空的不参与合并(宁可不并,不能错并)。合并放在整批解析完之后统一做——同一个人的两张名片可能来自不同文件,边做边合并会漏掉后面的重复。导出 CSV 带 UTF-8 BOM(不带的话 Excel 按本地编码解读,中文乱码);导出 vCard 用 UTF-8 无 BOM 并按 75 **字节**折行(中文一个字 3 字节,按字符折会超限)。导入侧:vCard 按属性解析(处理折行与 QUOTED-PRINTABLE),CSV 按表头别名映射,且列名叫电话不一定就是座机,仍按号码本身判断类型。
技术栈:C# / WinForms、系统自带 OCR、.NET Framework 4.8、零依赖免安装
已知局限:只支持 Windows 10/11(系统 OCR 与 WinForms 的要求)。OCR 对倾斜、反光、艺术字、手写体的识别率会下降,本工具不做事后智能纠错,靠结果表的可信度着色与人工修正来兜。一张图片按一张名片处理,一张图里塞多张名片不会被自动切开。识别语言依赖系统已装的语言包。
操作教程
- 打开程序
双击「名片批量识别录入.exe」。也可以直接把名片图片、或装着名片的文件夹拖到 exe 图标上,程序会带着这些文件启动。
预期结果:出现一个窗口:上方是工具条,左侧是待处理列表,右侧是识别结果表,右下是字段编辑区。 - 把名片加进来
点「添加图片…」选一张或多张名片照片;整个文件夹一起加就点「添加文件夹…」(会递归收子目录);最省事的办法是把图片或文件夹直接拖进窗口。微信导出的 .vcf、名单 .csv/.tsv 也一起加进来没问题。
预期结果:左侧列表逐行出现文件名,类型列显示「图片」或「文本」,状态列显示「待识别」。 - 补上不是图片的来源
聊天记录里复制来的联系方式,点「粘贴文本…」贴进文本框(多张名片之间空一行),点「解析这段文本」。手上什么都没有想先看效果,点「生成演示名片」。
预期结果:粘贴的文本会直接出现在右侧结果表里;演示名片会生成 4 张虚拟名片并加入待处理列表。 - 开始识别
点右上角「▶ 开始识别」。图片会走系统 OCR,文本文件直接解析。识别在后台进行,窗口不会卡死;中途想停就点「■ 中止」,已识别的部分照样保留。
预期结果:底部进度条按文件推进,状态文字显示「正在处理 3/4:名片3.png」,左侧每行的状态依次变成「完成(1 条)」。 - 核对结果表
看右侧表格的颜色:绿=姓名/号码/邮箱/公司四项齐全;白=基本可用;黄=缺字段;红=需人工核对。鼠标悬停在姓名格上会弹出这张名片的识别原文。
预期结果:一眼就能看出哪几行需要看,不用逐行比对。 - 修正可疑的行
点中要改的行,右下角会显示这条记录的各个字段和它的识别原文。改字段后点「应用到选中行」;如果是识别原文本身认错了,直接改原文再点「按原文重解析」更快(号码、邮箱、公司会重新抽一遍)。
预期结果:表格里那一行立刻更新,颜色按新的完整度重新着色。 - 导出
点右下角「导出 CSV」存成 Excel 可直接打开的表格(已带 UTF-8 BOM,中文不乱码);点「导出 vCard」存成 .vcf,发到手机上打开就能导入通讯录。
预期结果:弹出保存对话框,导出后提示条数与完整路径,并问你要不要现在打开。
常见问题
技术实现与后续维护
工具本体是单个 exe,运行环境要求很低:Windows 10/11 64 位,不需要装 .NET(4.8 是系统自带)、不需要联网、不需要装任何 OCR 引擎。代码分四层:Ocr.cs(图片转文字)、Parser.cs(文字转字段)、Contacts.cs(去重与导出)、MainForm.cs(界面与调度)。后续可扩展方向包括多名片分割、号段标注、直接导出 xlsx、正反面合并、CRM 导入模板映射等,详见开发文档第七节。需要在此基础上做定制(适配你们内部的导入模板、增加字段、对接内部系统),可以联系站长进行二次开发。
技术构成:
src/Program.cs—— 程序入口:正常启动 / --demo / --selftest 三种模式,全局异常兜底(GUI 没有控制台,异常必须变成弹窗)src/MainForm.cs—— WinForms 界面:工具条、拖拽收文件、待处理列表、结果表着色、字段编辑与重解析、后台线程与进度、CSV/vCard 导出src/Parser.cs—— 解析内核:文本归一化(汉字空格合并、全角转半角、OCR 分隔符纠正)+ 字段抽取(号码分类、标签剥离、姓名公司职位地址启发式)。纯函数,无界面依赖src/Contacts.cs—— 联系人集合:三级键去重合并、CSV/vCard 导出、vCard 与 CSV/TSV 导入、文本编码探测(UTF-8/GBK/UTF-16)src/Ocr.cs—— 系统 OCR 封装:WinRT 调用(自建 MTA 线程避免死锁)、像素格式转换、EXIF 方向纠正、尺度归一src/DemoCards.cs—— 演示名片生成:GDI+ 画 4 张虚拟名片(含 1 张刻意难认的,用来演示需人工核对的状态),信息全部虚构src/SelfTest.cs—— 内建自测:195 项断言,11 个分组,编译进 exe,用 --selftest 触发并写报告文件build.bat—— 一键重新编译 + 跑自测(自动定位 csc.exe、Windows.winmd 与 Facades)
运行环境:
环境:Windows 10/11 + .NET Framework 4.8(系统自带)+ Windows SDK 的 Windows.winmd(仅编译期需要)。直接运行 build.bat 即可,它会自动定位 csc.exe、Windows.winmd 与 Facades 并编译,然后跑自测。手工编译的关键参数:/target:winexe(不能是 exe,否则双击弹黑框)、/codepage:65001(源码是 UTF-8 中文,不指定 csc 会按系统 ANSI 读,编译不报错但全是乱码)、/r:Windows.winmd + Facades 下的 System.Runtime.dll 与 System.Runtime.InteropServices.WindowsRuntime.dll(调 WinRT 所需,仅编译期)、/optimize+。
可扩展方向:
- 一张图里多张名片的分割:按 OCR 结果的行位置做聚类,切成多条记录
- 手机号归属地与号段运营商标注(内置号段表即可,无需联网)
- 直接导出 .xlsx 而不是 CSV(需要自己写 xlsx 写入器,以保持零第三方依赖)
- 名片正面/背面合并:同一个人的两张图合成一条记录
- 导入模板映射配置:让用户把本工具的输出列对到自家 CRM 的字段名上
- 识别结果直接调 CRM 开放接口写入(这会让工具变成联网型,需同步更新展示页与使用说明里的联网声明)
本工具免费提供使用,但不对外分发源码。如果你需要在本工具基础上做功能调整、对接内部系统或长期维护,可以联系我们做二次开发,源码与工程文档可在定制合作中一并交付。
需要其它功能?可以定制
这个工具只做一件事:展会/微信收了一叠名片(照片、vcf、聊天里复制的文字),要一条条敲进 CRM。如果你的场景还需要别的处理,可以联系我们做二次开发,按你的实际数据格式和流程定制。
常见的定制需求:
- 适配你们内部 CRM 的导入模板(改列名、改列顺序、增加负责人等固定列)
- 增加字段(部门、工号、统一社会信用代码、税号等)并同步到导出表
- 批量导出 Excel 并拆多个页签
- 把识别结果直接写进数据库或中间表
- 接公司的图片存储批量拉取名图片并自动处理
- 联系方式:https://www.biyeyuanma.cn
- 定制说明:请附上你的数据样例(脱敏即可)和期望结果,方便快速评估工作量
- 交付形式:定制项目可交付可执行程序,按需一并交付源码与工程文档,支持长期维护
使用说明与免责声明
- 本工具在本地运行,不联网、不上传任何数据到服务器。
- 涉及文件改写的功能,请在使用前备份原始文件。
- 软件完全免费,可自由使用与转发,请勿用于倒卖。
- 因误操作造成的数据问题请自行承担。

