正在收集工作区信息正在筛选到最相关的信息根据代码分析,我来详细说明文字PDF的判断和处理流程:
## 文字PDF判断和处理详细说明
### 1. **文字PDF判断机制**
MinerU通过以下方式判断PDF类型:
```python
# 在 pipeline_doc_analyze 中
classify_result = classify(images) # 使用分类模型判断
if classify_result == "txt":
parse_method = "txt" # 文字PDF
else:
parse_method = "ocr" # 图片PDF/扫描件
```
**判断依据**:
- 使用 **classify 模型**(基于图像特征)判断PDF页面是否包含可提取的文本层
- 检查PDF页面的文本提取率
- 分析文本的连续性和完整性
### 2. **文字PDF处理流程**
```mermaid
graph TB
Start([PDF输入]) --> LoadPDF[加载PDF文档
PyPDF2/pypdfium2]
LoadPDF --> RenderImage[渲染PDF页面为图像
DPI=200]
RenderImage --> ClassifyModel{Classify分类模型
判断PDF类型}
ClassifyModel -->|文字PDF| TxtMode[parse_method=txt]
ClassifyModel -->|图片PDF| OcrMode[parse_method=ocr]
TxtMode --> LayoutDetection[布局检测模型
DocLayout-YOLO
检测文本/表格/图片/公式区域]
LayoutDetection --> ExtractRegions[提取各区域bbox坐标]
ExtractRegions --> ProcessText{处理文本区域}
ExtractRegions --> ProcessTable{处理表格区域}
ExtractRegions --> ProcessFormula{处理公式区域}
ExtractRegions --> ProcessImage{处理图像区域}
%% 文本处理分支
ProcessText --> ExtractPDFText[提取PDF嵌入文本
pdf_doc.get_text]
ExtractPDFText --> TextMapping[根据bbox映射文本内容]
TextMapping --> TextResult[文本块结果
type: text
content: 原生文本]
%% 表格处理分支
ProcessTable --> CropTable[裁剪表格区域图像]
CropTable --> TableDetect[表格结构检测
RapidTable/StructEqTable]
TableDetect --> TableCells[识别单元格位置]
TableCells --> CellTextExtract{单元格文本提取}
CellTextExtract -->|文字PDF模式| ExtractCellPDFText[提取PDF文本
根据单元格bbox]
CellTextExtract -->|需要OCR| TableOCR[OCR识别
PaddleOCR]
ExtractCellPDFText --> TableHTML[生成HTML表格
type: table
content: HTML]
TableOCR --> TableHTML
%% 公式处理分支
ProcessFormula --> FormulaClassify{公式类型检测}
FormulaClassify -->|行内公式| InlineFormula[inline_equation]
FormulaClassify -->|独立公式| DisplayFormula[interline_equation]
InlineFormula --> CropFormula1[裁剪公式区域]
DisplayFormula --> CropFormula2[裁剪公式区域]
CropFormula1 --> FormulaDetect[公式检测模型
YOLOv8-MFD]
CropFormula2 --> FormulaDetect
FormulaDetect --> FormulaRecog[公式识别模型
UniMERNet]
FormulaRecog --> FormulaLatex[生成LaTeX
type: equation
content: LaTeX]
%% 图像处理分支
ProcessImage --> SaveImage[保存图像文件
.png]
SaveImage --> ImageResult[图像引用
type: image
path: xxx.png]
%% 合并结果
TextResult --> MergeResults[合并所有元素]
TableHTML --> MergeResults
FormulaLatex --> MergeResults
ImageResult --> MergeResults
MergeResults --> SortByLayout[按布局顺序排序]
SortByLayout --> MiddleJSON[生成middle.json
包含所有结构化内容]
MiddleJSON --> GenerateMarkdown[生成Markdown
pipeline_union_make]
GenerateMarkdown --> FinalMD([输出: xxx.md])
%% OCR模式分支
OcrMode --> OcrLayout[布局检测
DocLayout-YOLO]
OcrLayout --> OcrProcess[OCR识别所有文本
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
```
## 详细说明
### **步骤1: PDF分类**
```python
# 在 mineru/backend/pipeline/pipeline_analyze.py
classify_result = classify(images_list) # 返回 "txt" 或 "ocr"
```
### **步骤2: 布局检测**
```python
# DocLayout-YOLO 检测各类元素
layout_det_results = layout_model.predict(image)
# 返回: text, title, table, figure, equation等区域的bbox
```
### **步骤3: 文字PDF文本提取**
```python
# 文字PDF模式: 直接提取文本
text_blocks = pdf_page.get_text("blocks")
for bbox in text_bboxes:
text = extract_text_from_bbox(pdf_page, bbox)
```
### **步骤4: 表格处理(文字PDF)**
```python
# 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)
```
### **步骤5: 公式处理**
```python
# 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$$
```
### **步骤6: 结果合并**
```python
# 按阅读顺序排序
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": "