Azure Language Studio OCR生成Python脚本无文本内容方案咨询
思路合理性判定
你的实现思路完全可行。Azure OCR返回结果本身自带内容类型、边界区域、层级关联标记,不需要额外训练模型就能实现「过滤表格、提取正文+公式+特殊符号」的需求。你之前拿不到实际文本,是因为Language Studio自动生成的示例脚本默认只返回接口调用状态、操作ID这类元数据,没有解析结果里的内容字段。
标准实现流程
- 前置准备
先把Word文档转成固定版式的高清文件(推荐转PDF或者300DPI以上的PNG,不要直接传.docx源文件给OCR接口,避免版式错乱导致识别偏差;如果文档里有复杂公式,转的时候不要压平公式图层),准备好Azure AI Vision的密钥和终结点,调用时选择read识别接口——这个接口原生支持输出LaTeX格式的数学公式,可识别绝大多数印刷类特殊符号。 - 接口调用配置
不要直接用Language Studio自动生成的默认脚本,手动构造请求时,在参数里指定2024-02-01及以后的模型版本,打开公式识别开关。接口是异步轮询机制,提交请求后要定期查询识别状态,等识别完成后再拉取完整结果对象,不要直接拿同步返回的请求回执解析内容。 - 内容过滤逻辑
识别结果按页返回内容块,每个块自带type标记和边界坐标:- 遇到
type为table的块,先记录这个块的四周边界坐标,跳过该块的内容提取 - 遇到
type为text、formula的块,先判断块的中心坐标是否落在已记录的表格边界范围内,如果不在,就把内容归入待拼接的正文队列 - 公式块会同时返回普通文本形式和LaTeX格式两种结果,按需取用即可;特殊符号会直接以Unicode编码存在文本字段中,不需要额外转码
- 遇到
- 结果后处理
Azure OCR返回的非表格内容默认按从上到下、从左到右的阅读顺序排列,直接拼接后处理多余换行、空格即可,多页文档逐页识别后按页码顺序拼接。
基础脚本参考结构
import azure.ai.vision as sdk # 初始化客户端 service_options = sdk.VisionServiceOptions( endpoint="替换为你的Azure服务终结点", key="替换为你的Azure服务密钥" ) # 传入转好格式的目标文件路径 vision_source = sdk.VisionSource(filename="替换为你的目标文件路径") # 配置识别参数 analysis_options = sdk.ImageAnalysisOptions() analysis_options.features = ( sdk.ImageAnalysisFeature.TEXT | sdk.ImageAnalysisFeature.OBJECTS ) # 指定支持公式识别的模型版本,开启公式识别 analysis_options.model_version = "2024-02-01" analysis_options.additional_properties["features"] = "formulas" # 提交识别请求 image_analyzer = sdk.ImageAnalyzer(service_options, vision_source, analysis_options) result = image_analyzer.analyze() final_content = [] # 第一步:收集当前页所有表格的边界坐标 table_bbox_list = [] if result.objects: for obj in result.objects: if obj.name == "table": x, y, w, h = obj.bounding_box.x, obj.bounding_box.y, obj.bounding_box.w, obj.bounding_box.h table_bbox_list.append({ "x_min": x, "y_min": y, "x_max": x + w, "y_max": y + h }) # 坐标判断工具:检查内容块是否在表格范围内 def is_block_in_table(block_polygon): # 取内容块中心点做判断,减少坐标误差 center_x = (block_polygon[0] + block_polygon[2]) / 2 center_y = (block_polygon[1] + block_polygon[5]) / 2 for bbox in table_bbox_list: if bbox["x_min"] <= center_x <= bbox["x_max"] and bbox["y_min"] <= center_y <= bbox["y_max"]: return True return False # 第二步:提取非表格区域的普通文本 if result.text: for line in result.text.lines: if not is_block_in_table(line.bounding_polygon): final_content.append(line.content) # 第三步:提取非表格区域的公式 if hasattr(result, "formulas") and result.formulas: for formula in result.formulas: if not is_block_in_table(formula.bounding_polygon): # 按需替换为formula.value获取普通文本格式的公式 final_content.append(f"$${formula.latex}$$") # 拼接输出最终结果 output = "\n".join(final_content) print(output)
注意:处理多页文档时,逐页执行上述识别、过滤、拼接逻辑即可;如果存在跨页表格,可以通过相邻页首尾的表格坐标匹配做合并过滤,避免把跨页表格的残留内容提取到正文中。
内容的提问来源于stack exchange,提问作者codewith_VR
相关产品推荐
相关产品推荐

