正在收集工作区信息正在筛选到最相关的信息根据代码分析,我来详细说明文字PDF的判断和处理流程:
MinerU通过以下方式判断PDF类型:
# 在 pipeline_doc_analyze 中
classify_result = classify(images) # 使用分类模型判断
if classify_result == "txt":
parse_method = "txt" # 文字PDF
else:
parse_method = "ocr" # 图片PDF/扫描件
判断依据:
graph TB
Start([PDF输入]) --> LoadPDF[加载PDF文档<br/>PyPDF2/pypdfium2]
LoadPDF --> RenderImage[渲染PDF页面为图像<br/>DPI=200]
RenderImage --> ClassifyModel{Classify分类模型<br/>判断PDF类型}
ClassifyModel -->|文字PDF| TxtMode[parse_method=txt]
ClassifyModel -->|图片PDF| OcrMode[parse_method=ocr]
TxtMode --> LayoutDetection[布局检测模型<br/>DocLayout-YOLO<br/>检测文本/表格/图片/公式区域]
LayoutDetection --> ExtractRegions[提取各区域bbox坐标]
ExtractRegions --> ProcessText{处理文本区域}
ExtractRegions --> ProcessTable{处理表格区域}
ExtractRegions --> ProcessFormula{处理公式区域}
ExtractRegions --> ProcessImage{处理图像区域}
%% 文本处理分支
ProcessText --> ExtractPDFText[提取PDF嵌入文本<br/>pdf_doc.get_text]
ExtractPDFText --> TextMapping[根据bbox映射文本内容]
TextMapping --> TextResult[文本块结果<br/>type: text<br/>content: 原生文本]
%% 表格处理分支
ProcessTable --> CropTable[裁剪表格区域图像]
CropTable --> TableDetect[表格结构检测<br/>RapidTable/StructEqTable]
TableDetect --> TableCells[识别单元格位置]
TableCells --> CellTextExtract{单元格文本提取}
CellTextExtract -->|文字PDF模式| ExtractCellPDFText[提取PDF文本<br/>根据单元格bbox]
CellTextExtract -->|需要OCR| TableOCR[OCR识别<br/>PaddleOCR]
ExtractCellPDFText --> TableHTML[生成HTML表格<br/>type: table<br/>content: HTML]
TableOCR --> TableHTML
%% 公式处理分支
ProcessFormula --> FormulaClassify{公式类型检测}
FormulaClassify -->|行内公式| InlineFormula[inline_equation]
FormulaClassify -->|独立公式| DisplayFormula[interline_equation]
InlineFormula --> CropFormula1[裁剪公式区域]
DisplayFormula --> CropFormula2[裁剪公式区域]
CropFormula1 --> FormulaDetect[公式检测模型<br/>YOLOv8-MFD]
CropFormula2 --> FormulaDetect
FormulaDetect --> FormulaRecog[公式识别模型<br/>UniMERNet]
FormulaRecog --> FormulaLatex[生成LaTeX<br/>type: equation<br/>content: LaTeX]
%% 图像处理分支
ProcessImage --> SaveImage[保存图像文件<br/>.png]
SaveImage --> ImageResult[图像引用<br/>type: image<br/>path: xxx.png]
%% 合并结果
TextResult --> MergeResults[合并所有元素]
TableHTML --> MergeResults
FormulaLatex --> MergeResults
ImageResult --> MergeResults
MergeResults --> SortByLayout[按布局顺序排序]
SortByLayout --> MiddleJSON[生成middle.json<br/>包含所有结构化内容]
MiddleJSON --> GenerateMarkdown[生成Markdown<br/>pipeline_union_make]
GenerateMarkdown --> FinalMD([输出: xxx.md])
%% OCR模式分支
OcrMode --> OcrLayout[布局检测<br/>DocLayout-YOLO]
OcrLayout --> OcrProcess[OCR识别所有文本<br/>PaddleOCR]
OcrProcess --> OcrTable[表格OCR]
OcrProcess --> OcrFormula[公式识别]
OcrTable --> MergeResults
OcrFormula --> MergeResults
%% 样式定义
classDef modelClass fill:#e1f5ff,stroke:#01579b,stroke-width:2px
classDef dataClass fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef processClass fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
classDef decisionClass fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
class ClassifyModel,LayoutDetection,TableDetect,FormulaDetect,FormulaRecog modelClass
class TextResult,TableHTML,FormulaLatex,ImageResult,MiddleJSON dataClass
class ExtractPDFText,CropTable,CropFormula1,CropFormula2,MergeResults processClass
class ProcessText,ProcessTable,ProcessFormula,ProcessImage,CellTextExtract,FormulaClassify decisionClass
# 在 mineru/backend/pipeline/pipeline_analyze.py
classify_result = classify(images_list) # 返回 "txt" 或 "ocr"
# DocLayout-YOLO 检测各类元素
layout_det_results = layout_model.predict(image)
# 返回: text, title, table, figure, equation等区域的bbox
# 文字PDF模式: 直接提取文本
text_blocks = pdf_page.get_text("blocks")
for bbox in text_bboxes:
text = extract_text_from_bbox(pdf_page, bbox)
# 1. 裁剪表格区域图像
table_image = crop_image(page_image, table_bbox)
# 2. 表格结构检测
table_structure = rapidtable_model.predict(table_image)
# 返回: cells的bbox和行列信息
# 3. 提取单元格文本
for cell_bbox in table_structure.cells:
# 文字PDF: 提取PDF文本
cell_text = extract_text_from_bbox(pdf_page, cell_bbox)
# 如果提取失败,使用OCR
if not cell_text:
cell_text = ocr_model.recognize(cell_image)
# 4. 生成HTML
table_html = generate_html_table(table_structure, cell_texts)
# 1. 裁剪公式区域
formula_image = crop_image(page_image, formula_bbox)
# 2. 公式检测(可选)
formula_regions = mfd_model.predict(formula_image)
# 3. 公式识别
latex_code = unimernet_model.recognize(formula_image)
# 输出: $E = mc^2$ 或 $$\int_{0}^{\infty} e^{-x^2} dx$$
# 按阅读顺序排序
sorted_blocks = sort_blocks_by_reading_order(all_blocks)
# 生成middle.json
middle_json = {
"pdf_info": [{
"page_idx": 0,
"para_blocks": [
{"type": "text", "content": "..."},
{"type": "table", "content": "<table>...</table>"},
{"type": "equation", "content": "$E=mc^2$"},
{"type": "image", "path": "images/image_0.png"}
]
}]
}
| 特性 | 文字PDF (txt模式) | 图片PDF (ocr模式) |
|---|---|---|
| 文本提取 | 直接读取PDF文本层 | OCR识别 |
| 表格单元格 | 优先提取PDF文本,失败才OCR | 全部OCR |
| 公式识别 | UniMERNet(图像→LaTeX) | 同左 |
| 处理速度 | 快(跳过大部分OCR) | 慢(全页OCR) |
| 准确性 | 文本100%准确 | 依赖OCR质量 |
这个流程确保了文字PDF能够最大化利用原生文本层,同时对表格和公式使用专用的识别模型来保证质量。