尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PaddleOCR 版面恢复(Layout Recovery)实战:将 PDF 与文档图像一键还原为可编辑 Word / Markdown

PaddleOCR 版面恢复(Layout Recovery)实战:将 PDF 与文档图像一键还原为可编辑 Word / Markdown PaddleOCR 版面恢复Layout Recovery实战将 PDF 与文档图像一键还原为可编辑 Word / Markdown【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR本篇技术指南系统讲解 PaddleOCR 版面恢复Layout Recovery模块的完整使用方法它可以把扫描 PDF、图像格式 PDF 与普通文档图片恢复成与原始版面一致的可编辑 Word 文档并支持输出 Markdown。你将掌握两种恢复方案的原理与选型、环境安装、模型下载、命令行参数配置以及从源码层面理解单栏/双栏识别、表格 HTML 转 docx、段落合并等核心实现细节可直接用于论文扫描件、合同、报表等文档的数字化整理。1. 什么是版面恢复两种方案与适用场景版面恢复模块位于 ppstructure/recovery/用于将图像或 PDF 恢复成与原图版面一致的、可编辑的 Word 文件。PaddleOCR 提供了两种恢复方法可以根据 PDF 的类型来选择标准 PDF 解析Standard PDF parse输入为标准 PDF基于 Python 的 PDF 转 Word 库 pdf2docx 优化而来。该方法使用 PyMuPDF 从 PDF 中提取数据再用规则解析版面最后用 python-docx 生成 docx 文件。图像格式 PDF 解析Image format PDF parse输入可以是标准 PDF 或图像格式 PDF版面恢复结合版面分析、表格识别两个子模块对图片、表格、标题等元素做更好的恢复支持中英文的 PDF 与文档图像输入。两种方法的输入格式与应用场景对比如下继承自官方文档方法输入格式应用场景 / 优缺点标准 PDF 解析pdf优点对非纸质文档恢复效果更好恢复后每页仍保持在同一页缺点部分中文文档中的英文字符会乱码部分内容仍会超出当前页面整页内容被恢复成表格格式部分图片恢复效果不佳图像格式 PDF 解析pdf、图片优点更适合纸质文档内容恢复OCR 识别效果更好缺点目前基于规则恢复内容排版间距、字体等效果有待进一步提升且版面恢复效果依赖版面分析从源码结构看两种方案在 ppstructure/predict_system.py 中通过use_pdf2docx_api参数分流置为True时走 pdf2docx 路线置为False默认时走基于 OCR 与版面分析的完整恢复链路。2. 环境安装2.1 安装 PaddlePaddlepython3 -m pip install --upgrade pip # 机器上装有 cuda9 或 cuda10 时运行下面命令安装 GPU 版本 python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple # CPU 安装 python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple更详细的安装要求可参考 PaddlePaddle 官方安装文档根据自身 CUDA 版本选择对应指令。2.2 安装 PaddleOCR1下载源码git clone https://github.com/PaddlePaddle/PaddleOCR2安装版面恢复的requirements版面恢复最终导出为 docx 文件因此需要安装 python-docx API同时需要安装 PyMuPDF API 来处理 PDF 格式的输入文件PyMuPDF 要求 Python 3.7。运行下面的命令安装全部依赖库python3 -m pip install -r ppstructure/recovery/requirements.txt查看 ppstructure/recovery/requirements.txt 可以看到恢复模块的核心依赖为python-docx # 生成 docx 文档 beautifulsoup4 # 表格 HTML 解析 fonttools4.43.0 # 字体处理 fire0.3.0 # CLI 工具库如果使用标准 PDF 解析方法还需要额外安装 pdf2docx 库wget https://paddleocr.bj.bcebos.com/whl/pdf2docx-0.0.0-py3-none-any.whl pip3 install pdf2docx-0.0.0-py3-none-any.whl3. 方案一标准 PDF 解析pdf2docx 路线use_pdf2docx_api参数用于启用基于 PDF 解析的版面恢复。该方案直接读取 PDF 内部已有的文字与矢量信息不做 OCR因此对非扫描件的数字原生 PDF 恢复效果更好且恢复后每一页内容仍保持在同一页。whl 包提供了快速使用方式安装paddleocr2.6后pip3 install paddleocr2.6 paddleocr --image_dirppstructure/docs/recovery/UnrealText.pdf --typestructure --recoverytrue --use_pdf2docx_apitrue命令行方式在 PaddleOCR 仓库根目录执行python3 predict_system.py \ --image_dirppstructure/docs/recovery/UnrealText.pdf \ --recoveryTrue \ --use_pdf2docx_apiTrue \ --output../output/源码调用链在 ppstructure/predict_system.py 的main()中当args.recovery and args.use_pdf2docx_api and flag_pdf同时成立时直接调用pdf2docx.converter.Converter完成转换并跳过后续的 OCR/版面分析流程try_import(pdf2docx) from pdf2docx.converter import Converter os.makedirs(args.output, exist_okTrue) docx_file os.path.join(args.output, {}_api.docx.format(img_name)) cv Converter(image_file) cv.convert(docx_file) cv.close()可以看到生成的 docx 以_api.docx后缀命名与基于 OCR 的方案_ocr.docx区分。注意ppstructure/docs/目录在当前仓库中已随文档结构调整运行时请将--image_dir替换为实际存在的 PDF 文件路径。4. 方案二基于 OCR 的图像格式 PDF 解析4.1 原理与流程通过版面分析将图像/PDF 文档划分为若干区域定位出文本、表格、图片等关键区域并记录每个区域的位置、类别和区域像素值信息。不同区域被分开处理文本区域执行 OCR 检测与识别在原有信息基础上补充 OCR 检测框坐标和文本内容信息表格区域识别表格记录表格的 html 与文本信息图片区域直接保存图片。最后通过版面信息、OCR 检测识别结果、表格信息和保存的图片即可还原出测试图片对应的文档。whl 包快速使用方式paddleocr --image_dirppstructure/docs/table/1.png --typestructure --recoverytrue --langen4.2 下载模型输入为英文文档时下载英文模型cd PaddleOCR/ppstructure # 下载模型 mkdir inference cd inference # 下载超轻量英文 PP-OCRv3 检测模型并解压 wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar tar xf en_PP-OCRv3_det_infer.tar # 下载超轻量英文 PP-OCRv3 识别模型并解压 wget https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_infer.tar tar xf en_PP-OCRv3_rec_infer.tar # 下载超轻量英文表格识别模型并解压 wget https://paddleocr.bj.bcebos.com/ppstructure/models/slanet/paddle3.0b2/en_ppstructure_mobile_v2.0_SLANet_infer.tar tar xf en_ppstructure_mobile_v2.0_SLANet_infer.tar # 下载 publaynet 数据集版面分析模型并解压 wget https://paddleocr.bj.bcebos.com/ppstructure/models/layout/picodet_lcnet_x1_0_fgd_layout_infer.tar tar xf picodet_lcnet_x1_0_fgd_layout_infer.tar cd ..输入为中文文档时下载中文模型中英文超轻量 PP-OCRv3 模型、表格识别模型与版面分析模型具体下载地址可参考 docs/version3.x/model_list.md 中的 PP-OCR 系列模型列表PP-OCRv3 检测/识别、表格识别模型与版面分析模型小节。中文场景下识别字典、版面分析字典也需要同步切换到中文版本见 4.3 参数说明。4.3 版面恢复命令与参数详解python3 predict_system.py \ --image_dir./docs/table/1.png \ --det_model_dirinference/en_PP-OCRv3_det_infer \ --rec_model_dirinference/en_PP-OCRv3_rec_infer \ --rec_char_dict_path../ppocr/utils/en_dict.txt \ --table_model_dirinference/en_ppstructure_mobile_v2.0_SLANet_infer \ --table_char_dict_path../ppocr/utils/dict/table_structure_dict.txt \ --layout_model_dirinference/picodet_lcnet_x1_0_fgd_layout_infer \ --layout_dict_path../ppocr/utils/dict/layout_dict/layout_publaynet_dict.txt \ --vis_font_path../doc/fonts/simfang.ttf \ --recoveryTrue \ --output../output/运行结束后每张图片对应的 docx 会保存在output字段指定的目录中。官方文档字段说明及对应源码默认值整理如下默认值来自 ppstructure/utility.py 的参数定义参数说明默认值 / 注意事项image_dir测试文件可以是图片、图片目录、PDF 文件、PDF 文件目录必填det_model_dirOCR 检测模型路径必填英文场景为en_PP-OCRv3_det_inferrec_model_dirOCR 识别模型路径必填rec_char_dict_pathOCR 识别字典路径使用中文模型时改为../ppocr/utils/ppocr_keys_v1.txt使用自己数据集训练的模型时改为训练字典table_model_dir表格识别模型路径必填table_char_dict_path表格识别字典路径使用中文模型时无需修改源码默认../ppocr/utils/dict/table_structure_dict_ch.txtlayout_model_dir版面分析模型路径必填layout_dict_path版面分析字典路径使用中文模型时改为../ppocr/utils/dict/layout_dict/layout_cdla_dict.txt源码默认layout_publaynet_dict.txtrecovery是否开启版面恢复默认Falseoutput保存恢复结果的路径默认./output源码定义vis_font_path可视化与 docx 排版使用的字体中文推荐doc/fonts/simfang.ttf仓库已提供除上述字段外ppstructure/utility.py 还定义了一批影响恢复质量的进阶参数可按需调整recovery_to_markdown默认False是否同时把恢复结果导出为 Markdown 文件use_pdf2docx_api默认False是否启用标准 PDF 解析方案layout_score_threshold默认0.5版面分析区域的分数阈值layout_nms_threshold默认0.5版面分析区域的 NMS 阈值table_max_len默认488表格识别输入最大边长table_algorithm默认TableAttn表格结构识别算法merge_no_span_structure默认True是否合并无跨行跨列的表格结构mode默认structure支持structure版面结构化与kie关键信息抽取两种模式。5. 源码剖析版面恢复如何生成 docx 与 Markdown理解恢复模块的输出管线需要先了解 ppstructure/predict_system.py 中StructureSystem的产出结构__call__返回res_list每个元素是一个区域 dict包含type如 text / title / table / figure / equation、bbox区域坐标、res区域内容与img_idx等字段。在main()中恢复逻辑在拿到这些区域结果后依次执行if args.recovery and res ! []: from ppstructure.recovery.recovery_to_doc import ( sorted_layout_boxes, convert_info_docx, ) from ppstructure.recovery.recovery_to_markdown import ( convert_info_markdown, ) h, w, _ img.shape res sorted_layout_boxes(res, w) all_res res ... if args.recovery and all_res ! []: convert_info_docx(img, all_res, save_folder, img_name) if args.recovery_to_markdown: convert_info_markdown(all_res, save_folder, img_name)即先对整页区域按阅读顺序排序sorted_layout_boxes再调用 recovery_to_doc.py 的convert_info_docx生成 Word若开启recovery_to_markdown还会调用 recovery_to_markdown.py 的convert_info_markdown生成 Markdown。下面逐个剖析。5.1 单栏 / 双栏版面排序sorted_layout_boxesconvert_info_docx使用WD_SECTION.CONTINUOUS分节来模拟原文档的单栏/双栏混排。判断依据来自 recovery_to_doc.py 中的sorted_layout_boxes(res, w)函数以页面宽度w为基准把区域按上到下、左到右排序sorted(res, keylambda x: (x[bbox][1], x[bbox][0]))当区域框横跨中轴x0 w/2且x2 w/2或占据大部分宽度时标记为single单栏当区域框落在左半区x0 w/4且x2 3*w/4或右半区x0 w/4且x2 w/2时标记为double双栏并分别归入res_left/res_right列表最终合并输出。convert_info_docx中根据region[layout]动态切换节的列数检测到double时把w:cols设为2检测回single时设回1从而在 docx 中还原原始论文/书籍的双栏排布。5.2 docx 生成细节convert_info_docxrecovery_to_doc.py 的convert_info_docx(img, res, save_folder, img_name)负责把区域结果写入 python-docx 文档默认样式为正文字体Times New Roman 中文宋体、字号 6.5pt。各类型区域的处理策略figure图片读取预处理阶段保存到save_folder/img_name/{bbox}_{img_idx}.jpg的图片居中插入单栏下宽 5 英寸双栏下宽 2 英寸title标题通过doc.add_heading(region[res][0][text])生成标题段落table表格实例化HtmlToDocx解析器用TableGrid样式把表格 HTML 还原为 Word 表格equation公式latex结果在 docx 管线中暂不渲染直接跳过text / 其他逐行写入普通段落首行缩进 0.25 英寸字号 10pt。最终文件保存为{img_name}_ocr.docx并输出日志docx save to ...。5.3 表格 HTML 转 WordHtmlToDocxppstructure/recovery/table_process.py 实现了一个基于HTMLParser与 BeautifulSoup 的 HTML→docx 转换器代码参考自开源 html2docx 项目。核心能力包括通过 CSS 选择器table tr、table thead tr等解析表格行列结构并累加colspan得到总列数支持colspan/rowspan合并单元格docx_cell.merge(...)并跳过已合并占用的单元格支持嵌套表格ignore_nested_tables只保留最外层表格支持b、strong、em、i、u、s、sup、sub等内联样式与code/pre的等宽字体映射th表头自动加粗自动清理多余空白与换行保证单元格内容整洁。正是这套转换器让表格识别模型输出的tabletrtd...HTML 结构能够无损还原为可编辑的 Word 表格。5.4 Markdown 输出与段落合并convert_info_markdown开启--recovery_to_markdownTrue后恢复结果会额外保存为{img_name}_ocr.md。 recovery_to_markdown.py 中的convert_info_markdown按区域类型输出figure输出居中的img src...引用title输出# 标题一级标题行table直接写入表格 HTML 原文equation以$$latex$$形式输出公式header / footer跳过页眉页脚text调用段落合并函数还原自然段落并转义*、、~、$等 Markdown 特殊字符。其中段落合并是该模块最有意思的规则check_merge_method依据文本区域 bbox 左边界与第一行文字左边界之间的距离x1_distance是否大于首行行高来选择合并策略convert_text_space_head段首缩进判据当两行文字起始x坐标之差小于行高h时视为同一段落否则插入\n\n分段convert_text_space_tail段末空白判据计算每行宽度是否接近整行宽row_width width - row_height满行视为本段继续未满行则说明段落到此为止。这种基于排版几何特征的启发式合并正是文档中提到的目前基于规则恢复、排版效果待提升的对应实现。6. 常见问题与进阶建议英文乱码 / 内容超出页面这是标准 PDF 解析方案对中文文档的已知短板此时建议改用方案二图像格式 PDF 解析 OCR对纸质或混排文档效果更好恢复效果依赖版面分析方案二的文本区域合并、表格抽取都建立在版面分析区域划分之上可通过调整layout_score_threshold/layout_nms_threshold默认均为 0.5或替换更优的版面分析模型来改善中文字体docx 中文字体依赖--vis_font_path指定的字体仓库内置 doc/fonts/simfang.ttf仿宋可直接使用批量处理image_dir支持传入图片/PDF 目录配合--process_id、--total_process_num多进程参数见 ppstructure/predict_system.py 的use_mp分支即可并行处理大批量文档。7. 更多资源版面分析模块的训练、评估与推理教程ppstructure/layout/README.md表格识别模块的训练、评估与推理教程ppstructure/table/README.md版面恢复相关 Python 实现ppstructure/recovery/recovery_to_doc.py、ppstructure/recovery/recovery_to_markdown.py、ppstructure/recovery/table_process.py结构识别主流程与参数解析ppstructure/predict_system.py、ppstructure/utility.py快速上手文档docs/quick_start.en.md中文版见 docs/quick_start.md模型列表与下载docs/version3.x/model_list.md【免费下载链接】PaddleOCR飞桨多语言OCR工具包实用超轻量OCR系统支持80种语言识别提供数据标注与合成工具支持服务器、移动端、嵌入式及IoT设备端的训练与部署 Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表