# firecrawl/pdf-inspector architecture

> Architecture diagram of the GitHub repository firecrawl/pdf-inspector, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-18). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/firecrawl/pdf-inspector
- Repository: https://github.com/firecrawl/pdf-inspector

## Overview

pdf-inspector classifies a PDF, extracts positioned text, analyzes layout, and produces Markdown; native entry points can optionally route only suspect pages through OCR. The principal flow is: caller submits bytes or a file, the core parses once, classification selects text/OCR behavior, extraction and layout produce structured content, and Markdown/result bindings return it. The tree and excerpts confirm the core and OCR orchestration; several lower-level call arrows are inferred only where module responsibilities and README behavior align.

Main entry points: [`src/lib.rs`](https://github.com/firecrawl/pdf-inspector/blob/main/src/lib.rs) (Document Core), [`src/types.rs`](https://github.com/firecrawl/pdf-inspector/blob/main/src/types.rs) (Process Result), [`src/vision/pipeline.rs`](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/pipeline.rs) (OCR Pipeline), [`src/bin/pdf2md.rs`](https://github.com/firecrawl/pdf-inspector/blob/main/src/bin/pdf2md.rs) (PDF CLI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interfaces["Public Interfaces"]
  node_rust_api["Rust API<br/>[lib.rs]"]
  node_cli["PDF CLI<br/>[pdf2md.rs]"]
  node_python_binding["Python Binding<br/>[python.rs]"]
  node_node_binding["Node Binding<br/>[lib.rs]"]
  node_wasm_binding["WASM Binding<br/>[lib.rs]"]
end

subgraph group_core["PDF Processing"]
  node_document_core["Document Core<br/>[lib.rs]"]
  node_classifier["PDF Classifier<br/>[detector.rs]"]
  node_text_extractor["Text Extractor<br/>[mod.rs]"]
  node_font_decoder["Font Decoder<br/>[tounicode.rs]"]
  node_layout_analysis["Layout Analysis<br/>[analysis.rs]"]
  node_table_detection["Table Detection<br/>[mod.rs]"]
  node_structure_tree["Structure Tree<br/>[structure_tree.rs]"]
  node_markdown_converter["Markdown Converter<br/>[mod.rs]"]
end

subgraph group_vision["Selective OCR"]
  node_ocr_pipeline["OCR Pipeline<br/>[pipeline.rs]"]
  node_ocr_routing["OCR Routing<br/>[routing.rs]"]
  node_page_renderer["Page Renderer<br/>[render.rs]"]
  node_pdfium_backend["PDFium Backend<br/>[pdfium.rs]"]
  node_ocr_engine["OCR Engine<br/>[oar.rs]"]
  node_model_store["Model Store<br/>[models.rs]"]
end

subgraph group_outputs["Results"]
  node_process_result["Process Result<br/>[types.rs]"]
end

node_app_user(("Application Caller"))
node_cli_user(("CLI User"))
node_browser_app(("Browser Application"))
node_pdf_input["PDF Document"]
node_onnx_runtime["ONNX Runtime"]

node_cli_user -->|"invokes"| node_cli
node_app_user -->|"calls"| node_rust_api
node_app_user -->|"calls"| node_python_binding
node_app_user -->|"calls"| node_node_binding
node_browser_app -->|"calls"| node_wasm_binding
node_pdf_input -->|"provides bytes"| node_cli
node_pdf_input -->|"provides bytes"| node_rust_api
node_pdf_input -->|"provides bytes"| node_python_binding
node_pdf_input -->|"provides bytes"| node_node_binding
node_pdf_input -->|"provides bytes"| node_wasm_binding
node_cli -->|"processes PDF"| node_document_core
node_rust_api -->|"processes PDF"| node_document_core
node_python_binding -->|"processes PDF"| node_document_core
node_node_binding -->|"processes PDF"| node_document_core
node_wasm_binding -->|"processes PDF"| node_document_core
node_document_core -->|"classifies pages"| node_classifier
node_document_core -->|"extracts text"| node_text_extractor
node_text_extractor -->|"decodes fonts"| node_font_decoder
node_document_core -->|"analyzes layout"| node_layout_analysis
node_layout_analysis -->|"detects tables"| node_table_detection
node_document_core -->|"reads structure"| node_structure_tree
node_document_core -->|"converts content"| node_markdown_converter
node_markdown_converter -->|"formats tables"| node_table_detection
node_classifier -->|"returns classification"| node_document_core
node_text_extractor -->|"returns items"| node_document_core
node_markdown_converter -->|"returns Markdown"| node_document_core
node_document_core -->|"assembles result"| node_process_result
node_document_core -.->|"routes OCR"| node_ocr_pipeline
node_ocr_pipeline -->|"runs routes"| node_ocr_routing
node_ocr_routing -->|"renders pages"| node_page_renderer
node_page_renderer -->|"uses PDFium"| node_pdfium_backend
node_ocr_routing -->|"recognizes pages"| node_ocr_engine
node_ocr_engine -.->|"runs inference"| node_onnx_runtime
node_ocr_pipeline -->|"acquires model"| node_model_store
node_ocr_pipeline -->|"fuses OCR"| node_process_result
node_process_result -->|"returns result"| node_cli
node_process_result -->|"returns result"| node_rust_api
node_process_result -->|"returns result"| node_python_binding
node_process_result -->|"returns result"| node_node_binding
node_process_result -->|"returns result"| node_wasm_binding

click node_rust_api "https://github.com/firecrawl/pdf-inspector/blob/main/src/lib.rs"
click node_cli "https://github.com/firecrawl/pdf-inspector/blob/main/src/bin/pdf2md.rs"
click node_python_binding "https://github.com/firecrawl/pdf-inspector/blob/main/src/python.rs"
click node_node_binding "https://github.com/firecrawl/pdf-inspector/blob/main/napi/src/lib.rs"
click node_wasm_binding "https://github.com/firecrawl/pdf-inspector/blob/main/wasm/src/lib.rs"
click node_document_core "https://github.com/firecrawl/pdf-inspector/blob/main/src/lib.rs"
click node_classifier "https://github.com/firecrawl/pdf-inspector/blob/main/src/detector.rs"
click node_text_extractor "https://github.com/firecrawl/pdf-inspector/blob/main/src/extractor/mod.rs"
click node_font_decoder "https://github.com/firecrawl/pdf-inspector/blob/main/src/tounicode.rs"
click node_layout_analysis "https://github.com/firecrawl/pdf-inspector/blob/main/src/markdown/analysis.rs"
click node_table_detection "https://github.com/firecrawl/pdf-inspector/blob/main/src/tables/mod.rs"
click node_structure_tree "https://github.com/firecrawl/pdf-inspector/blob/main/src/structure_tree.rs"
click node_markdown_converter "https://github.com/firecrawl/pdf-inspector/blob/main/src/markdown/mod.rs"
click node_process_result "https://github.com/firecrawl/pdf-inspector/blob/main/src/types.rs"
click node_ocr_pipeline "https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/pipeline.rs"
click node_ocr_routing "https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/routing.rs"
click node_page_renderer "https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/render.rs"
click node_pdfium_backend "https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/pdfium.rs"
click node_ocr_engine "https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/oar.rs"
click node_model_store "https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/models.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_rust_api,node_cli,node_python_binding,node_node_binding,node_wasm_binding,node_cli_user,node_browser_app toneBlue
class node_document_core,node_classifier,node_text_extractor,node_font_decoder,node_layout_analysis,node_table_detection,node_structure_tree,node_markdown_converter toneAmber
class node_ocr_pipeline,node_ocr_routing,node_page_renderer,node_pdfium_backend,node_ocr_engine,node_model_store toneMint
class node_process_result toneRose
class node_app_user,node_pdf_input,node_onnx_runtime toneIndigo
```

## Components

### Public Interfaces

- [Rust API](https://github.com/firecrawl/pdf-inspector/blob/main/src/lib.rs): `src/lib.rs`
- [PDF CLI](https://github.com/firecrawl/pdf-inspector/blob/main/src/bin/pdf2md.rs): `src/bin/pdf2md.rs`
- [Python Binding](https://github.com/firecrawl/pdf-inspector/blob/main/src/python.rs): `src/python.rs`
- [Node Binding](https://github.com/firecrawl/pdf-inspector/blob/main/napi/src/lib.rs): `napi/src/lib.rs`
- [WASM Binding](https://github.com/firecrawl/pdf-inspector/blob/main/wasm/src/lib.rs): `wasm/src/lib.rs`

### PDF Processing

- [Document Core](https://github.com/firecrawl/pdf-inspector/blob/main/src/lib.rs): `src/lib.rs`
- [PDF Classifier](https://github.com/firecrawl/pdf-inspector/blob/main/src/detector.rs): `src/detector.rs`
- [Text Extractor](https://github.com/firecrawl/pdf-inspector/blob/main/src/extractor/mod.rs): `src/extractor/mod.rs`
- [Font Decoder](https://github.com/firecrawl/pdf-inspector/blob/main/src/tounicode.rs): `src/tounicode.rs`
- [Layout Analysis](https://github.com/firecrawl/pdf-inspector/blob/main/src/markdown/analysis.rs): `src/markdown/analysis.rs`
- [Table Detection](https://github.com/firecrawl/pdf-inspector/blob/main/src/tables/mod.rs): `src/tables/mod.rs`
- [Structure Tree](https://github.com/firecrawl/pdf-inspector/blob/main/src/structure_tree.rs): `src/structure_tree.rs`
- [Markdown Converter](https://github.com/firecrawl/pdf-inspector/blob/main/src/markdown/mod.rs): `src/markdown/mod.rs`

### Selective OCR

- [OCR Pipeline](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/pipeline.rs): `src/vision/pipeline.rs`
- [OCR Routing](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/routing.rs): `src/vision/routing.rs`
- [Page Renderer](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/render.rs): `src/vision/render.rs`
- [PDFium Backend](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/pdfium.rs): `src/vision/pdfium.rs`
- [OCR Engine](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/oar.rs): `src/vision/oar.rs`
- [Model Store](https://github.com/firecrawl/pdf-inspector/blob/main/src/vision/models.rs): `src/vision/models.rs`

### Results

- [Process Result](https://github.com/firecrawl/pdf-inspector/blob/main/src/types.rs): `src/types.rs`

### Other components

- **Application Caller**
- **CLI User**
- **Browser Application**
- **PDF Document**
- **ONNX Runtime**

## Connections

- CLI User → PDF CLI: invokes
- Application Caller → Rust API: calls
- Application Caller → Python Binding: calls
- Application Caller → Node Binding: calls
- Browser Application → WASM Binding: calls
- PDF Document → PDF CLI: provides bytes
- PDF Document → Rust API: provides bytes
- PDF Document → Python Binding: provides bytes
- PDF Document → Node Binding: provides bytes
- PDF Document → WASM Binding: provides bytes
- PDF CLI → Document Core: processes PDF
- Rust API → Document Core: processes PDF
- Python Binding → Document Core: processes PDF
- Node Binding → Document Core: processes PDF
- WASM Binding → Document Core: processes PDF
- Document Core → PDF Classifier: classifies pages
- Document Core → Text Extractor: extracts text
- Text Extractor → Font Decoder: decodes fonts
- Document Core → Layout Analysis: analyzes layout
- Layout Analysis → Table Detection: detects tables
- Document Core → Structure Tree: reads structure
- Document Core → Markdown Converter: converts content
- Markdown Converter → Table Detection: formats tables
- PDF Classifier → Document Core: returns classification
- Text Extractor → Document Core: returns items
- Markdown Converter → Document Core: returns Markdown
- Document Core → Process Result: assembles result
- Document Core → OCR Pipeline: routes OCR
- OCR Pipeline → OCR Routing: runs routes
- OCR Routing → Page Renderer: renders pages
- Page Renderer → PDFium Backend: uses PDFium
- OCR Routing → OCR Engine: recognizes pages
- OCR Engine → ONNX Runtime: runs inference
- OCR Pipeline → Model Store: acquires model
- OCR Pipeline → Process Result: fuses OCR
- Process Result → PDF CLI: returns result
- Process Result → Rust API: returns result
- Process Result → Python Binding: returns result
- Process Result → Node Binding: returns result
- Process Result → WASM Binding: returns result
