# Flow 2A: Ingestion & Parsing

Diagram ini merupakan *zoom-in* dari langkah pertama pada Main Ingestion Pipeline. Fase ini bertanggung jawab untuk mengubah dokumen PDF mentah menjadi teks Markdown terstruktur. Sistem menggunakan pendekatan **Dual-Pass (Hybrid)** yang cerdas untuk membedakan PDF *native digital* dan hasil *scan* (gibberish), dilengkapi dengan mekanisme proteksi seperti *timeout guard* pada proses OCR.

```mermaid
flowchart TD
    classDef init fill:#e3f2fd,stroke:#1565c0,stroke-width:2px;
    classDef logic fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
    classDef io fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
    classDef error fill:#ffebee,stroke:#c62828,stroke-width:2px;

    Start((Start)):::init --> ReceivePDF["Terima File PDF"]:::io
    ReceivePDF --> IsGibberish{"is_gibberish()?<br/>Threshold &lt; 0.6?"}:::logic
    
    %% Alur PDF Digital
    IsGibberish -- "No (PDF Digital)" --> PyMuPDF["pymupdf4llm.to_markdown<br/>write_images=True"]:::logic
    PyMuPDF --> CheckMD{"MD Valid?"}:::logic
    CheckMD -- "Yes" --> ScanImages["Scan &amp; Ekstrak Gambar<br/>ke Direktori Temp"]:::io
    ScanImages --> OCRImages["RapidOCR untuk setiap Gambar"]:::logic
    OCRImages --> InjectOCR["Injeksi Teks OCR ke<br/>dalam Markdown"]:::logic
    InjectOCR --> End["Return Raw Markdown"]:::init
    
    %% Alur Fallback / Scan
    IsGibberish -- "Yes (PDF Scan)" --> FullOCR["Fallback: Full OCR"]:::logic
    CheckMD -- "No / Error" --> FullOCR
    
    FullOCR --> LoopPages["Loop Setiap Halaman PDF"]:::logic
    LoopPages --> ThreadOCR["Threaded OCR per Halaman<br/>RapidOCR"]:::logic
    ThreadOCR --> TimeoutGuard{"Selesai dalam<br/>30 detik?"}:::logic
    
    TimeoutGuard -- "Yes" --> CollectText["Kumpulkan Teks Halaman"]:::io
    TimeoutGuard -- "No" --> SkipPage["Skip Halaman<br/>(Timeout Guard)"]:::error
    
    CollectText --> NextPage{"Ada halaman lain?"}:::logic
    SkipPage --> NextPage
    
    NextPage -- "Yes" --> LoopPages
    NextPage -- "No" --> JoinText["Gabungkan Teks<br/>(Double Newline)"]:::logic
    JoinText --> End
```

### Penjelasan Detail (Option C Focus):
1. **Logika Dual-Pass (Hybrid):** Sistem pertama kali memeriksa rasio karakter alfabetis (`is_gibberish`). Jika rasio < 0.6, PDF dianggap sebagai hasil scan dan dialihkan ke `Full OCR`. Jika rasio baik, diproses dengan `pymupdf4llm` yang jauh lebih cepat.
2. **Proteksi & Keamanan:** Proses OCR sangat rawan terhadap *hang* atau konsumsi memori tak terbatas. Oleh karena itu, saat melakukan `Full OCR`, setiap halaman diproses di dalam *thread* terpisah (`_ocr_single_page`) dengan `OCR_PAGE_TIMEOUT` 30 detik. Jika lebih dari itu, halaman dilewati agar keseluruhan *pipeline* tidak terhenti.
3. **Injeksi Gambar Dinamis:** Pada mode PDF Digital, gambar yang tertanam di dalam PDF diekstrak ke *temporary directory*, lalu dibaca menggunakan *RapidOCR*. Hasil teksnya disuntikkan kembali ke dalam *Markdown* tepat di lokasi gambar tersebut berada.
