基于RapidOCR的Python OCR源码:识别并返回HTML结构
简介这是一套基于 rapidOCR 改造的完整 OCR 图片识别源码面向需要将图片文字提取并结构化输出的 Python 开发者与项目集成者。它解决了传统 OCR 只返回纯文本、难以直接嵌入页面的问题通过内置 /engine/ocr 接口接收 http 链接、本地文件或文件流等多种图片形式并返回带标记的 HTML 结构可直接嵌入其他页面或复制使用。资源包共 46 个文件以 23 个 py 源码与 17 个 pyc 编译文件为主体另含 3 个 onnx 模型文件、1 个 yaml 配置、1 个 html 页面及 1 个 txt 依赖说明压缩包约 14.26MB目录涵盖 rapid_ocr 核心模块、web_service 服务入口与 common 工具封装结构清晰便于二次开发。目前已有 1739 人学习下载适合希望快速落地图片转文字、文本识别功能的开发者参考与集成。1. 从一张发票截图到结构化 HTML这套 OCR 源码到底解决了什么很多做业务系统的开发者都遇到过这种需求用户上传一张发票、身份证或合同截图后台不仅要识别出文字还要把文字按版面位置还原成带标签的 HTML 结构方便前端直接渲染或做字段抽取。市面上现成的 OCR 接口要么只返回纯文本要么返回一堆坐标框需要自己拼装真正能直接吐出语义化 HTML 的少之又少。标题里这套「已用 Python 实现 OCR 功能并返回 HTML 结构」的源码核心思路是基于 RapidOCR 做二次改造——RapidOCR 本身是一个推理速度快、依赖轻量的开源 OCR 工具链但它默认输出的是文本框坐标加文本内容离「HTML 结构」还差一层版面分析和标签映射。这套源码的价值就在于把这层补齐了检测、识别、方向分类走 RapidOCR后处理阶段做行合并、段落归组、表格区域判定最后按语义标签输出 HTML。适合谁适合需要私有化部署 OCR、又不想从零训练模型的中小团队也适合想研究版面还原逻辑的个人开发者。下面我按「先跑通、再拆解、后调优」的顺序把这套方案的落地路径讲清楚。2. 环境搭建与 RapidOCR 最小可跑通示例2.1 依赖选型为什么是 RapidOCR 而不是 PaddleOCR 原生RapidOCR 本质上是把 PaddleOCR 的模型做了 ONNX 转换和推理层重写好处是推理时不依赖 PaddlePaddle 框架装包体积小、启动快在 CPU 上也能跑到可用的速度。原生 PaddleOCR 功能更全但依赖链重部署到一些受限环境里经常卡在框架安装上。这套源码选 RapidOCR 作为底座说明作者更看重部署轻量化和跨平台一致性。常见做法是先用 RapidOCR 的rapidocr_onnxruntime包跑通检测加识别确认模型文件齐全再往上叠版面分析逻辑。需要注意RapidOCR 有三个模型文件——检测模型、识别模型、方向分类模型缺一不可方向分类模型负责把旋转 180 度的文本纠正过来很多识别不准的案例其实是漏了这一步。2.2 最小可跑通代码三行核心调用加结果解析先装依赖再跑一个最小示例确认环境没问题# 安装 rapidocr_onnxruntime它会自动拉取 onnxruntime 和 opencv pip install rapidocr_onnxruntimefrom rapidocr_onnxruntime import RapidOCR # 初始化引擎默认加载内置的检测、识别、方向分类三个模型 engine RapidOCR() # 传入图片路径返回 (文本框坐标, 文本内容, 置信度) 的列表 result, elapse engine(invoice_sample.png) # result 为 None 表示没检测到任何文本 if result: for box, text, score in result: # box 是四个点的坐标text 是识别出的字符串 print(box, text, round(score, 3)) else: print(未检测到文本检查图片是否过暗或分辨率过低)这段代码的逻辑说明RapidOCR()初始化时会去默认缓存目录找模型文件第一次运行会自动下载。engine()返回两个值第一个是识别结果列表第二个是各阶段耗时。每个结果元素是三元组box是四点多边形坐标顺序是左上、右上、右下、左下。参数方面如果图片是扫描件且文字水平可以在初始化时传use_angle_clsFalse关掉方向分类省一点推理时间如果图片分辨率很高建议先缩放到长边 1600 像素左右再送入否则检测阶段会非常慢。置信度低于 0.5 的结果建议直接丢弃这类多半是噪点误检。2.3 从识别结果到 HTML坐标排序与行合并策略拿到result之后不能直接拼 HTML因为 OCR 返回的顺序是按检测框的某种内部排序不保证阅读顺序。需要先按纵坐标聚类成行再按横坐标排序。核心逻辑是计算每个 box 的中心点 y 坐标把 y 差值小于某个阈值通常是行高的 0.5 倍的框归为同一行行内按 x 坐标升序排列。行与行之间按 y 升序。这样得到的顺序才符合人眼阅读习惯。合并成行之后再判断哪些行属于同一个段落——如果相邻两行的左边界 x 差值很小且行间距均匀就归为同一段。这一步是后续生成p标签的基础。表格区域则更复杂需要检测是否存在多列对齐的框常见做法是用 x 坐标的分布做列切分再按行列交叉填充td。3. 版面分析把文本框还原成 HTML 语义标签3.1 行、段、块的三级归组逻辑版面分析的核心是把零散的文本框组织成有层次的块。我一般会分三级处理第一级是行归组按 y 坐标聚类第二级是段归组把行间距小于阈值且左边界对齐的行合并成段第三级是块归组把段按垂直间距和字体高度差异分成不同区块比如标题块、正文块、表格块。阈值怎么定行归组的 y 阈值建议取所有框高度的中位数乘以 0.6段归组的行间距阈值取行高中位数的 1.5 倍块归组的垂直间距阈值取段间距中位数的 2 倍。这些参数没有万能值需要根据实际文档类型微调。发票类文档行距紧凑阈值要调小合同类文档段落分明阈值可以放宽。3.2 表格区域判定与 td 填充表格是 HTML 结构里最难还原的部分。这套源码的思路是先通过框的 x 坐标分布找出列边界再通过 y 坐标分布找出行边界构建一个二维网格然后把每个框的文本填入对应的单元格。具体做法是对所有框的左右边界 x 坐标做一维聚类聚类中心就是列边界同理对上下边界 y 坐标聚类得到行边界。聚类时用简单的间隔阈值法即可不需要上 DBSCAN 这类重型算法。填充时判断框的中心点落在哪个行列区间内。如果某个单元格没有框落入就填空字符串。这里有个坑合并单元格在纯坐标分析下无法直接识别需要额外判断某个框是否跨越了多个列区间如果是就设置colspan属性。这个逻辑写起来不复杂但边界情况多建议先用简单表格测试。3.3 生成 HTML 的模板与转义处理生成 HTML 时不要用字符串拼接容易出转义问题。推荐用html.escape()对识别文本做转义防止文本里的、、破坏结构。模板可以用简单的 f-string 或 Jinja2。段落用p标题根据字体高度判断用h2或h3表格用table加tr、td。字体高度怎么来OCR 结果里没有直接给字号但可以用 box 的高度近似代替。如果某行的 box 高度明显大于正文行高中位数就判定为标题。这个启发式规则在大多数文档上够用。输出时建议保留一个>import html def build_html(paragraphs): # paragraphs 是已经归组好的段落列表每段包含文本和类型 parts [] for para in paragraphs: text html.escape(para[text]) # 转义防止 XSS 和结构破坏 if para[type] title: parts.append(fh2 style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />

相关新闻

8G显存本地部署MiniMax H3:视频生成与ComfyUI接入全攻略

8G显存本地部署MiniMax H3:视频生成与ComfyUI接入全攻略

第一次在8G显存的卡上把MiniMax H3本地版跑起来的时候,我自己都有点没缓过劲。最初印象里,视频生成模型想本地部署怎么也得16G显存起步,结果在量化方案的加持下不仅能跑,还能连续产出多条可用的漫剧分镜。这篇就把我从环境搭建、模…

2026/10/12 8:27:02 阅读更多 →
iff链:用链式等价证明破解循环论证的双向陷阱

iff链:用链式等价证明破解循环论证的双向陷阱

我最早对“当且仅当”四个字产生警惕,是在一次代码评审里。当时某个公开算法库的文档宣称“某数据结构能在常数时间内判定可达性当且仅当存在一条长度不超过给定阈值的路径”,实现者也把证明贴成了两段:“⇒”是正向,“⇐”是反向…

2026/10/12 8:27:02 阅读更多 →
Kaggle房价预测高维回归:从特征工程到Stacking融合实战

Kaggle房价预测高维回归:从特征工程到Stacking融合实战

简介:这份PDF资料面向具备一定Python与机器学习基础、希望系统掌握高维数据分类与回归实战的读者,以Kaggle经典房价预测赛题为载体,重点讲解如何用Stacking思维融合多种模型的优势。内容围绕完整流程展开:从pandas读取train与test…

2026/10/12 8:27:02 阅读更多 →

最新新闻

C语言生产级单向链表实现与内存安全实践

C语言生产级单向链表实现与内存安全实践

1. 项目概述:为什么链表操作是程序员绕不开的“基本功”“Problem C.链表操作”——光看这个标题,你可能觉得它像一道老掉牙的算法题,出现在某次模拟赛的第三题位置,代码区里还留着几行被注释掉的调试输出。但如果你在真实项目中写…

2026/10/12 9:19:55 阅读更多 →
mold 插件系统拆解:LTO、自定义符号处理如何在链接阶段“插一脚“

mold 插件系统拆解:LTO、自定义符号处理如何在链接阶段“插一脚“

mold 插件系统拆解:LTO、自定义符号处理如何在链接阶段"插一脚" 【免费下载链接】mold mold 🦠: A Modern Linker in Rust 🦀 项目地址: https://gitcode.com/GitHub_Trending/mo/mold 链接器在大多数开发者眼里是一个"…

2026/10/12 9:19:55 阅读更多 →
VibeVibe 第 1 章收官:个人主页 v1 的第一轮验收清单与下一轮优化清单实战

VibeVibe 第 1 章收官:个人主页 v1 的第一轮验收清单与下一轮优化清单实战

文档教程Vibe Coding示例工程 【免费下载链接】vibe-vibe The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零…

2026/10/12 9:19:55 阅读更多 →
基于SpringBoot的养老服务平台设计与实现:从毕设选题到答辩全流程解析

基于SpringBoot的养老服务平台设计与实现:从毕设选题到答辩全流程解析

每到毕业设计选题季,总有不少同学拿着“Java毕设选题推荐:基于SpringBoot的养老服务平台设计与实现”这类标题来问我,说网上看着功能很多,但不确定自己能不能做出来、答辩好不好讲、代码拿过来能不能跑起来。今天我就以这个项目为…

2026/10/12 9:19:55 阅读更多 →
SpringBoot养老服务平台开发全流程:设计、数据库、部署与实战

SpringBoot养老服务平台开发全流程:设计、数据库、部署与实战

1. 项目构思与技术选型:为什么用SpringBoot做养老服务平台先说结论:Java毕设选型,SpringBoot确实是目前最稳、最省心、最容易出效果的方向之一。这不是客套话,是我连续带过好几个毕业设计项目之后的真实感受。养老服务平台这个题目…

2026/10/12 9:19:55 阅读更多 →
CATIA V6 2013安装部署全流程:版本识别、环境变量与避坑指南

CATIA V6 2013安装部署全流程:版本识别、环境变量与避坑指南

简介:这套CATIA V6 2013安装资源面向机械、航空、汽车等工程领域的设计师与初学者,帮助用户获取并完成该高端三维设计软件的安装部署,同时补充版本功能认知。压缩包共7个文件,总大小2.85MB,以torrent种子、txt安装说明…

2026/10/12 9:18:55 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →