Table data format fixes (ocr_to_unified_converter.py): - Fix ElementType string conversion using value-based lookup - Add content-based HTML table detection (reclassify TEXT to TABLE) - Use BeautifulSoup for robust HTML table parsing - Generate TableData with fully populated cells arrays Image cropping for OCR track (pp_structure_enhanced.py): - Add _crop_and_save_image method for extracting image regions - Pass source_image_path to _process_parsing_res_list - Return relative filename (not full path) for saved_path - Consistent with Direct Track image saving pattern Also includes: - Add beautifulsoup4 to requirements.txt - Add architecture overview documentation - Archive fix-ocr-track-table-data-format proposal (22/24 tasks) Known issues: OCR track images are restored but still have quality issues that will be addressed in a follow-up proposal. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.1 KiB
6.1 KiB
Tool_OCR 架構說明與 UML
本文件概覽 Tool_OCR 的主要組件、資料流與雙軌處理(OCR / Direct),並附上 UML 關係圖以協助判斷改動的影響範圍。
系統分層與重點元件
- API 層(FastAPI):
app/main.py啟動應用、掛載路由(routers/auth.py,routers/tasks.py,routers/admin.py),並在 lifespan 初始化記憶體管理、服務池與併發控制。 - 任務/檔案管理:
task_service.py與file_access_service.py掌管任務 CRUD、路徑與權限;Task/TaskFile模型紀錄結果檔路徑。 - 核心處理服務:
OCRService(services/ocr_service.py)負責雙軌路由與 OCR;整合偵測、直抽、OCR、統一格式轉換、匯出與 PDF 生成。 - 雙軌偵測/直抽:
DocumentTypeDetector判斷走 Direct 或 OCR;DirectExtractionEngine使用 PyMuPDF 直接抽取文字/表格/圖片(必要時觸發混合模式補抽圖片)。 - OCR 解析:PaddleOCR +
PPStructureEnhanced抽取 23 類元素;OCRToUnifiedConverter轉成UnifiedDocument統一格式。 - 匯出/呈現:
UnifiedDocumentExporter產出 JSON/Markdown;pdf_generator_service.py產生版面保持 PDF;前端透過/api/v2/tasks/{id}/download/*取得。 - 資源控管:
memory_manager.py(MemoryGuard、prediction semaphore、模型生命週期),service_pool.py(OCRService池)避免多重載模與 GPU 爆滿。
處理流程(任務層級)
- 上傳:
POST /api/v2/upload建立 Task 並寫檔到uploads/(含 SHA256、檔案資訊)。 - 啟動:
POST /api/v2/tasks/{id}/start(ProcessingOptions,可含pp_structure_params)→ 背景process_task_ocr取得服務池中的OCRService。 - 軌道決策:
DocumentTypeDetector.detect分析 MIME、PDF 文字覆蓋率或 Office 轉 PDF 後的抽樣結果:- Direct:
DirectExtractionEngine.extract產出UnifiedDocument;若偵測缺圖則啟用混合模式呼叫 OCR 抽圖或渲染 inline 圖。 - OCR:
process_file_traditional→ PaddleOCR + PP-Structure →OCRToUnifiedConverter.convert產生UnifiedDocument。 - 以
ProcessingTrack記錄ocr/direct/hybrid,處理時間與統計寫入 metadata。
- Direct:
- 輸出保存:
UnifiedDocumentExporter寫_result.json(含 metadata、statistics)與_output.md;pdf_generator_service產出_layout.pdf;路徑回寫 DB。 - 下載/檢視:前端透過
/download/json|markdown|pdf|unified取檔;/metadata讀 JSON metadata 回傳統計與processing_track。
前端流程摘要
UploadPage:呼叫apiClientV2.uploadFile,首個task_id存於uploadStore.batchId。ProcessingPage:對batchId呼叫startTask(預設use_dual_track=true,支援自訂pp_structure_params),輪詢狀態。ResultsPage/TaskDetailPage:使用getTask與getProcessingMetadata顯示processing_track、統計並提供 JSON/Markdown/PDF/Unified 下載。TaskHistoryPage:列出任務、支援重新啟動、重試、下載。
共同模組與影響點
- UnifiedDocument(
models/unified_document.py)為 Direct/OCR 共用輸出格式;所有匯出/PDF/前端 track 顯示依賴其欄位與 metadata。 - 服務池/記憶體守護:Direct 與 OCR 共用同一
OCRService實例池與 MemoryGuard;新增資源或改動需確保遵循 acquire/release、清理與 semaphore 規則。 - 偵測閾值變更:
DocumentTypeDetector參數調整會影響 Direct 與 OCR 分流比例,間接改變 GPU 載荷與結果格式。 - 匯出/PDF:任何 UnifiedDocument 結構變動會影響 JSON/Markdown/PDF 產出與前端下載/預覽;需同步維護轉換與匯出器。
UML 關係圖(Mermaid)
classDiagram
class TasksRouter {
+upload_file()
+start_task()
+download_json/markdown/pdf/unified()
+get_metadata()
}
class TaskService {+create_task(); +update_task_status(); +get_task_by_id()}
class FileAccessService
class OCRService {
+process()
+process_with_dual_track()
+process_file_traditional()
+save_results()
}
class DocumentTypeDetector {+detect()}
class DirectExtractionEngine {+extract(); +check_document_for_missing_images()}
class OCRToUnifiedConverter {+convert()}
class UnifiedDocument
class UnifiedDocumentExporter {+export_to_json(); +export_to_markdown()}
class PDFGeneratorService {+generate_layout_pdf(); +generate_from_unified_document()}
class ServicePool {+acquire(); +release()}
class MemoryManager <<singleton>>
class OfficeConverter {+convert_to_pdf()}
class PPStructureEnhanced {+analyze_with_full_structure()}
TasksRouter --> TaskService
TasksRouter --> FileAccessService
TasksRouter --> OCRService : background process via process_task_ocr
OCRService --> DocumentTypeDetector : track recommendation
OCRService --> DirectExtractionEngine : direct track
OCRService --> OCRToUnifiedConverter : OCR track result -> UnifiedDocument
OCRService --> OfficeConverter : Office -> PDF
OCRService --> PPStructureEnhanced : layout analysis (PP-StructureV3)
OCRService --> UnifiedDocumentExporter : persist results
OCRService --> PDFGeneratorService : layout-preserving PDF
OCRService --> ServicePool : acquired instance
ServicePool --> MemoryManager : model lifecycle / GPU guard
UnifiedDocumentExporter --> UnifiedDocument
PDFGeneratorService --> UnifiedDocument
影響判斷指引
- 改 Direct/偵測邏輯:會改變
processing_track與結果格式;前端顯示與下載 JSON/Markdown/PDF 仍依賴 UnifiedDocument,需驗證匯出與 PDF 生成。 - 改 OCR/PP-Structure 參數:僅影響 OCR track;Direct track 不受
pp_structure_params影響(符合 spec),需維持processing_track填寫。 - 改 UnifiedDocument 結構/統計:需同步
UnifiedDocumentExporter、pdf_generator_service、前端getProcessingMetadata/下載端點。 - 改資源控管:服務池或 MemoryGuard 調整會同時影響 Direct/OCR 執行時序與穩定性,須確保 acquire/release 與 semaphore 不被破壞。