GLM-OCR与Typora等Markdown编辑器联动:图片转文字一键嵌入

发布时间:2026/5/20 0:55:58

GLM-OCR与Typora等Markdown编辑器联动:图片转文字一键嵌入 GLM-OCR与Typora联动让图片里的文字“活”起来每次写Markdown文档最头疼的就是处理截图里的文字。要么得手动敲一遍要么得在图片和文档之间来回切换效率低不说还容易出错。尤其是整理技术笔记、会议纪要或者收集资料的时候这种痛苦感会加倍。最近在折腾一个挺有意思的小工具它能把GLM-OCR这个图片文字识别模型和Typora这类我常用的Markdown编辑器给打通。简单来说就是在编辑器里对着图片点一下右键图片里的文字就被识别出来然后自动插入到文档里变成可以搜索、可以复制的纯文本。整个过程几乎不用离开编辑器流畅得让人上瘾。这篇文章我就来聊聊怎么把这个想法落地分享一个具体的实现思路和代码示例。如果你也受够了在图片和文字之间手动搬运的麻烦那这个方案或许能给你带来一些灵感。1. 场景与痛点我们为什么需要它在深入技术细节之前我们先看看这个功能到底能解决哪些实际问题。1.1 典型的“图片转文字”工作流想象一下你正在写一篇技术博客里面需要引用一段命令行操作的截图。传统的工作流大概是这样的截图并保存到本地。将图片插入到Typora文档中。打开一个在线的OCR网站或者启动一个本地的OCR工具。上传刚才的截图。等待识别结果把识别出来的文字复制下来。回到Typora在图片下方或者某个地方粘贴这段文字可能还要手动加上引用标记比如或者!-- --。这个过程里你至少切换了3-4个不同的窗口或应用操作是割裂的。更糟的是如果文档里有十几张这样的截图重复劳动会让人崩溃。1.2 理想中的“一键式”体验我们想要的体验其实很简单所有操作都在编辑器内完成。在Typora中右键点击文档里已经插入的图片。从右键菜单中选择一个选项比如“识别图中文字”。稍等片刻取决于图片大小和网络识别出的文字就以你预设好的格式比如作为图片的标题、引用块或注释自动插入到图片旁边或下方。这样一来工作流被极大地简化了。你不再需要离开写作环境注意力可以完全集中在内容创作上效率自然就上去了。这对于需要处理大量含文字图片的笔记、文档编写者来说提升是非常明显的。2. 解决方案设计如何连接GLM-OCR与TyporaTypora本身并没有提供直接的插件API来让我们扩展右键菜单并执行自定义脚本。但是我们可以通过“曲线救国”的方式来实现。核心思路是利用操作系统的自动化能力监听Typora中的特定操作如复制图片路径然后触发我们的OCR脚本。这里我设计了一个基于Python的本地服务方案它相对轻量且跨平台Windows/macOS/Linux适应性较好。2.1 整体架构整个方案可以分成三个部分OCR服务端一个本地的Python脚本它负责启动一个HTTP服务。这个服务提供一个API接口当收到一张图片的路径或二进制数据时它会调用GLM-OCR模型进行识别并返回识别出的文本。桥梁脚本另一个Python脚本它扮演“触发器”和“协调者”的角色。它监听操作系统剪贴板的变化当检测到变化符合我们的预期比如变化的内容是一个本地图片文件路径就自动调用OCR服务端的API获取识别结果再将结果按照特定格式写回剪贴板或直接插入到前端应用中。Typora或编辑器侧的集成我们通过配置Typora的“图像”工具或者结合操作系统的快捷键工具如AutoHotkey for Windows, Automator for macOS将“复制图片路径”这个动作与我们的桥梁脚本绑定。flowchart TD A[用户在Typora中br右键点击图片] -- B[通过自定义快捷键br或工具复制图片路径] B -- C[桥梁脚本监听到br剪贴板内容变化] C -- D[脚本将图片路径发送至br本地OCR服务API] D -- E[OCR服务调用GLM-OCR模型br识别图片文字] E -- F[OCR服务返回br识别后的文本] F -- G[桥梁脚本将文本格式化为brMarkdown引用或注释] G -- H[脚本将格式化后的文本br写入剪贴板或模拟按键插入] H -- I[用户在Typora中粘贴br完成文字插入]2.2 为什么选择本地服务你可能会问为什么不直接用现成的OCR软件或者用浏览器的插件深度集成本地服务可以与你的工作流无缝结合定制化程度高。隐私保护图片数据完全在本地处理无需上传到第三方服务器对于处理敏感信息如内部文档、代码截图非常重要。离线可用一旦GLM-OCR模型部署在本地整个流程可以离线运行不依赖网络。定制输出你可以完全控制识别后文本的格式是变成引用块、代码块还是普通的段落都可以自由定义。3. 分步实现指南下面我们一步步来搭建这个环境。你需要一些基本的Python知识。3.1 第一步准备GLM-OCR环境首先你需要一个能运行的GLM-OCR服务。这里假设你已经通过一些方式比如使用预构建的Docker镜像在本地部署好了GLM-OCR的API服务。通常这类服务会提供一个HTTP端点例如http://localhost:8000/ocr。为了演示我们可以用一个简单的FastAPI应用来模拟这个服务。当然实际使用时你需要替换成真正的GLM-OCR模型调用。安装依赖pip install fastapi uvicorn pillow模拟的OCR服务端代码 (ocr_server.py):from fastapi import FastAPI, File, UploadFile from fastapi.responses import JSONResponse from PIL import Image import io import pytesseract # 这里用Tesseract模拟实际应替换为GLM-OCR调用 app FastAPI() app.post(/ocr) async def ocr_image(file: UploadFile File(...)): 模拟的OCR接口。 实际应用中这里应调用你部署的GLM-OCR模型。 try: # 读取上传的图片 image_data await file.read() image Image.open(io.BytesIO(image_data)) # 关键步骤调用OCR引擎 # 此处使用pytesseract进行模拟识别。 # 你需要将其替换为调用你本地GLM-OCR服务的代码。 # 例如使用requests.post向你的GLM-OCR服务发送image_data。 text pytesseract.image_to_string(image, langchi_simeng) # 中英文识别 # 清理识别结果中的多余空行 cleaned_text \n.join([line.strip() for line in text.splitlines() if line.strip()]) return JSONResponse(content{status: success, text: cleaned_text}) except Exception as e: return JSONResponse(content{status: error, message: str(e)}, status_code500) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)注意上面的代码使用了Tesseract作为模拟。你需要根据GLM-OCR的实际API文档修改# 关键步骤调用OCR引擎 部分的代码。运行这个服务python ocr_server.py现在你的本地OCR API服务就在http://localhost:8000运行了并提供了一个/ocr接口。3.2 第二步编写桥梁脚本这个脚本是核心它负责监听剪贴板、调用OCR服务、处理结果。桥梁脚本代码 (typora_ocr_bridge.py):import sys import os import requests import pyperclip # 用于操作剪贴板 import win32clipboard # Windows特定用于获取文件路径 import time from PIL import ImageGrab, Image import io # 配置你的OCR服务地址 OCR_SERVER_URL http://localhost:8000/ocr def get_image_from_clipboard(): 尝试从剪贴板获取图片。优先尝试获取文件路径其次是图片数据。 # 方案1: 检查剪贴板中是否有文件路径在Typora中复制图片后通常会有 try: import win32clipboard win32clipboard.OpenClipboard() if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP): files win32clipboard.GetClipboardData(win32clipboard.CF_HDROP) if files and os.path.isfile(files[0]): image_path files[0] # 检查是否为图片文件 if image_path.lower().endswith((.png, .jpg, .jpeg, .bmp, .gif)): win32clipboard.CloseClipboard() print(f检测到图片文件路径: {image_path}) return {type: file_path, data: image_path} win32clipboard.CloseClipboard() except Exception as e: print(f检查文件路径失败: {e}) # 方案2: 检查剪贴板中是否有图片数据 try: image ImageGrab.grabclipboard() if image is not None: print(检测到剪贴板中的图片数据) # 将图片转换为字节流 img_byte_arr io.BytesIO() image.save(img_byte_arr, formatPNG) img_byte_arr img_byte_arr.getvalue() return {type: image_data, data: img_byte_arr} except Exception as e: print(f检查图片数据失败: {e}) return None def call_ocr_service(image_info): 调用OCR服务识别文字。 files {} if image_info[type] file_path: # 如果是文件路径打开文件并上传 with open(image_info[data], rb) as f: files {file: (os.path.basename(image_info[data]), f, image/png)} response requests.post(OCR_SERVER_URL, filesfiles) else: # 如果是图片数据直接上传字节流 files {file: (clipboard.png, image_info[data], image/png)} response requests.post(OCR_SERVER_URL, filesfiles) if response.status_code 200: result response.json() if result.get(status) success: return result.get(text, ) else: print(fOCR服务返回错误: {result.get(message)}) else: print(f调用OCR服务失败状态码: {response.status_code}) return def format_text_for_markdown(ocr_text): 将OCR识别出的文本格式化为适合Markdown插入的格式。 if not ocr_text: return # 这里可以定义你喜欢的格式例如 # 1. 作为引用块插入 formatted_text f **识别文字**:\n {ocr_text.replace(chr(10), chr(10) )} # 2. 或者作为HTML注释插入在Typora中不可见但便于整理 # formatted_text f!--\n识别文字:\n{ocr_text}\n-- # 3. 或者直接作为段落插入 # formatted_text ocr_text return formatted_text def main(): print(Typora-OCR桥梁脚本已启动正在监听剪贴板...) print(请在Typora中复制图片或图片路径然后按回车键触发识别。) last_clipboard_content None try: while True: input() # 等待用户按回车键触发这里可以替换为热键监听 print(触发识别...) image_info get_image_from_clipboard() if image_info: print(正在调用OCR服务...) ocr_text call_ocr_service(image_info) if ocr_text: formatted_text format_text_for_markdown(ocr_text) # 将结果写回剪贴板 pyperclip.copy(formatted_text) print(识别完成格式化后的文本已复制到剪贴板。) print(请回到Typora在图片下方粘贴即可。) print(- * 40) else: print(未能识别出文字。) else: print(剪贴板中没有检测到图片或图片路径。) except KeyboardInterrupt: print(\n脚本已退出。) if __name__ __main__: main()脚本使用说明安装必要的Python库pip install requests pyperclip pillow pywin32(Windows) 或pypi对应库。确保第一步的OCR服务 (ocr_server.py) 正在运行。运行桥梁脚本python typora_ocr_bridge.py。在Typora中右键点击一张图片选择“复制图片”或“复制图像地址”这会复制图片的本地路径到剪贴板。切换到命令行窗口按一下回车键。脚本会检测剪贴板内容调用OCR服务并将格式化后的文字复制到剪贴板。回到Typora在图片下方按CtrlV粘贴识别出的文字就会以引用块格式插入。3.3 第三步提升体验自动化触发上面需要手动按回车还是不够“一键”。我们可以借助系统级的自动化工具将其绑定到一个全局快捷键上。Windows (使用 AutoHotkey): 安装AutoHotkey后创建一个.ahk脚本^!v:: ; 设置 CtrlAltV 为触发快捷键 Run, pythonw C:\你的路径\typora_ocr_bridge.py,, Hide ; 这里需要更复杂的交互上述桥梁脚本需修改为通过热键直接触发并回写。 ; 一个更简单的思路修改桥梁脚本使其成为一个常驻服务并通过热键触发其核心函数。 return更成熟的方案是将桥梁脚本改造成一个后台服务并通过进程间通信如socket接收热键指令然后自动完成“检测剪贴板-OCR-写回剪贴板”的全流程。macOS (使用 Automator AppleScript): 可以创建一个“快速操作”用AppleScript调用Python脚本并将其绑定到快捷键。由于实现完整的后台热键服务涉及较多系统特定代码本文提供一个可行的起点。你可以基于上述桥梁脚本将其改造成一个带有简单GUI如Tkinter或系统托盘图标的小工具点击按钮或快捷键即可完成操作体验会更完美。4. 实际效果与扩展思路当我按照这个思路搭建好环境后处理带截图的文档效率有了质的飞跃。原本需要几分钟的复制、切换、粘贴操作现在基本上在几秒钟内就能完成。识别准确率取决于GLM-OCR模型本身的能力对于清晰的印刷体、屏幕截图文字效果已经非常可靠。这个方案还有很大的扩展空间多格式支持不仅可以插入为引用块还可以根据需求插入为代码块、表格甚至是直接替换图片Alt文本。批量处理可以修改脚本让其扫描整个Markdown文档自动识别所有本地图片并批量插入文字。与其他编辑器集成原理是通用的只需调整获取图片路径的方式就可以适配VS Code、Obsidian等其他支持Markdown的编辑器。结果后处理在识别文本插入前可以加入简单的后处理比如自动分段、去除无关字符、甚至简单的翻译。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻