Kreuzberg Document Extraction
Kreuzberg is a high-performance document intelligence library with a Rust core and native bindings for Python, Node.js/TypeScript, Ruby, Go, Java, C#, PHP, and Elixir. It extracts text, tables, metadata, and images from 91+ file formats including PDF, Office documents, images (with OCR), HTML, email, archives, and academic formats.
Use this skill when writing code that:
- Extracts text or metadata from documents
- Performs OCR on scanned documents or images
- Batch-processes multiple files
- Configures extraction options (output format, chunking, OCR, language detection)
- Implements custom plugins (post-processors, validators, OCR backends)
If the kreuzberg MCP server is registered in this session, prefer its tools over shelling out to the CLI — they expose the same extraction surface with structured arguments and results.
Installation
Python
pip install kreuzberg
# Optional OCR backends:
pip install kreuzberg[easyocr] # EasyOCR
Node.js
npm install @kreuzberg/node
Rust
# Cargo.toml
[dependencies]
kreuzberg = { version = "4", features = ["tokio-runtime"] }
# features: tokio-runtime (required for sync + batch), pdf, ocr, chunking,
# embeddings, language-detection, keywords-yake, keywords-rake
CLI
brew install kreuzberg-dev/tap/kreuzberg
# or run without a persistent install (the CLI proxy package self-installs the binary):
npx @kreuzberg/kreuzberg-cli --help
uvx --from kreuzberg-cli kreuzberg --help
# or download a prebuilt binary from the latest GitHub release:
# https://github.com/kreuzberg-dev/kreuzberg/releases/latest
# or build from source:
cargo install --git https://github.com/kreuzberg-dev/kreuzberg kreuzberg-cli
Quick Start
Python (Async)
from kreuzberg import extract_file
result = await extract_file("document.pdf")
print(result.content) # extracted text
print(result.metadata) # document metadata
print(result.tables) # extracted tables
Python (Sync)
from kreuzberg import extract_file_sync
result = extract_file_sync("document.pdf")
print(result.content)
Node.js
import { extractFile } from "@kreuzberg/node";
const result = await extractFile("document.pdf");
console.log(result.content);
console.log(result.metadata);
console.log(result.tables);
Node.js (Sync)
import { extractFileSync } from "@kreuzberg/node";
const result = extractFileSync("document.pdf");
Rust (Async)
use kreuzberg::{extract_file, ExtractionConfig};
#[tokio::main]
async fn main() -> kreuzberg::Result<()> {
let config = ExtractionConfig::default();
let result = extract_file("document.pdf", None, &config).await?;
println!("{}", result.content);
Ok(())
}
Rust (Sync) — requires tokio-runtime feature
use kreuzberg::{extract_file_sync, ExtractionConfig};
fn main() -> kreuzberg::Result<()> {
let config = ExtractionConfig::default();
let result = extract_file_sync("document.pdf", None, &config)?;
println!("{}", result.content);
Ok(())
}
CLI
kreuzberg extract document.pdf
kreuzberg extract document.pdf --format json
kreuzberg extract document.pdf --content-format markdown
Configuration
All languages use the same configuration structure with language-appropriate naming conventions.
Python (snake_case)
from kreuzberg import (
ExtractionConfig, OcrConfig, TesseractConfig,
PdfConfig, ChunkingConfig,
)
config = ExtractionConfig(
ocr=OcrConfig(
backend="tesseract",
language="eng",
tesseract_config=TesseractConfig(psm=6, enable_table_detection=True),
),
pdf_options=PdfConfig(passwords=["secret123"]),
chunking=ChunkingConfig(max_chars=1000, max_overlap=200),
output_format="markdown",
)
result = await extract_file("document.pdf", config=config)
Node.js (camelCase)
import { extractFile, type ExtractionConfig } from "@kreuzberg/node";
const config: ExtractionConfig = {
ocr: { backend: "tesseract", language: "eng" },
pdfOptions: { passwords: ["secret123"] },
chunking: { maxChars: 1000, maxOverlap: 200 },
outputFormat: "markdown",
};
const result = await extractFile("document.pdf", null, config);
Rust (snake_case)
use kreuzberg::{ExtractionConfig, OcrConfig, ChunkingConfig, OutputFormat};
let config = ExtractionConfig {
ocr: Some(OcrConfig {
backend: "tesseract".into(),
language: "eng".into(),
..Default::default()
}),
chunking: Some(ChunkingConfig {
max_characters: 1000,
overlap: 200,
..Default::default()
}),
output_format: OutputFormat::Markdown,
..Default::default()
};
let result = extract_file("document.pdf", None, &config).await?;
Config File (TOML)
output_format = "markdown"
[ocr]
backend = "tesseract"
language = "eng"
[chunking]
max_characters = 1000
overlap = 200
[pdf_options]
passwords = ["secret123"]
# CLI: auto-discovers kreuzberg.toml in current/parent directories
kreuzberg extract doc.pdf
# or explicit:
kreuzberg extract doc.pdf --config kreuzberg.toml
kreuzberg extract doc.pdf --config-json '{"ocr":{"backend":"tesseract","language":"deu"}}'
Batch Processing
Python
from kreuzberg import batch_extract_files, batch_extract_files_sync
# Async
results = await batch_extract_files(["doc1.pdf", "doc2.docx", "doc3.xlsx"])
# Sync
results = batch_extract_files_sync(["doc1.pdf", "doc2.docx"])
for result in results:
print(f"{len(result.content)} chars extracted")
Node.js
import { batchExtractFiles } from "@kreuzberg/node";
const results = await batchExtractFiles(["doc1.pdf", "doc2.docx"]);
Rust — requires tokio-runtime feature
use kreuzberg::{batch_extract_file, ExtractionConfig};
let config = ExtractionConfig::default();
let paths = vec!["doc1.pdf", "doc2.docx"];
let results = batch_extract_file(paths, &config).await?;
CLI
kreuzberg batch *.pdf --format json
kreuzberg batch docs/*.docx --content-format markdown
OCR
OCR runs automatically for images and scanned PDFs. Tesseract is the default backend (native binding, no external install required).
Backends
- Tesseract (default): Built-in native binding. All Tesseract languages supported.
- EasyOCR (Python only):
pip install kreuzberg[easyocr]. Pass easyocr_kwargs={"gpu": True}.
- PaddleOCR (Python only): Bundled since 4.8.5, no extra install needed. Pass
paddleocr_kwargs={"use_angle_cls": True}.
- Guten (Node.js only): Built-in OCR backend via
GutenOcrBackend.
Language Codes
config = ExtractionConfig(ocr=OcrConfig(language="eng")) # English
config = ExtractionConfig(ocr=OcrConfig(language="eng+deu")) # Multiple
config = ExtractionConfig(ocr=OcrConfig(language="all")) # All installed
Force OCR
config = ExtractionConfig(force_ocr=True) # OCR even if text is extractable
ExtractionResult Fields
| Field |
Python |
Node.js |
Rust |
Description |
| Text content |
result.content |
result.content |
result.content |
Extracted text (str/String) |
| MIME type |
result.mime_type |
result.mimeType |
result.mime_type |
Input document MIME type |
| Metadata |
result.metadata |
result.metadata |
result.metadata |
Document metadata (dict/object/HashMap) |
| Tables |
result.tables |
result.tables |
result.tables |
Extracted tables with cells + markdown |
| Languages |
result.detected_languages |
result.detectedLanguages |
result.detected_languages |
Detected languages (if enabled) |
| Chunks |
result.chunks |
result.chunks |
result.chunks |
Text chunks (if chunking enabled) |
| Images |
result.images |
result.images |
result.images |
Extracted images (if enabled) |
| Elements |
result.elements |
result.elements |
result.elements |
Semantic elements (if element_based format) |
| Pages |
result.pages |
result.pages |
result.pages |
Per-page content (if page extraction enabled) |
| Keywords |
result.keywords |
result.keywords |
result.keywords |
Extracted keywords (if enabled) |
Error Handling
Python
from kreuzberg import (
extract_file_sync, KreuzbergError, ParsingError,
OCRError, ValidationError, MissingDependencyError,
)
try:
result = extract_file_sync("file.pdf")
except ParsingError as e:
print(f"Failed to parse: {e}")
except OCRError as e:
print(f"OCR failed: {e}")
except ValidationError as e:
print(f"Invalid input: {e}")
except MissingDependencyError as e:
print(f"Missing dependency: {e}")
except KreuzbergError as e:
print(f"Extraction failed: {e}")
Node.js
import {
extractFile,
KreuzbergError,
ParsingError,
OcrError,
ValidationError,
MissingDependencyError,
} from "@kreuzberg/node";
try {
const result = await extractFile("file.pdf");
} catch (e) {
if (e instanceof ParsingError) {
/* ... */
} else if (e instanceof OcrError) {
/* ... */
} else if (e instanceof ValidationError) {
/* ... */
} else if (e instanceof KreuzbergError) {
/* ... */
}
}
Rust
use kreuzberg::{extract_file, ExtractionConfig, KreuzbergError};
let config = ExtractionConfig::default();
match extract_file("file.pdf", None, &config).await {
Ok(result) => println!("{}", result.content),
Err(KreuzbergError::Parsing(msg)) => eprintln!("Parse error: {msg}"),
Err(KreuzbergError::Ocr(msg)) => eprintln!("OCR error: {msg}"),
Err(e) => eprintln!("Error: {e}"),
}
Common Pitfalls
- Python ChunkingConfig fields: Use
max_chars and max_overlap, NOT max_characters or overlap.
- Rust extract_file signature: Third argument is
&ExtractionConfig (a reference), not Option. Use &ExtractionConfig::default() for defaults.
- Rust feature gates:
extract_file_sync, batch_extract_file, and batch_extract_file_sync all require features = ["tokio-runtime"] in Cargo.toml.
- Rust async context:
extract_file is async. Use #[tokio::main] or call from an async context.
- CLI --format vs --content-format:
--format controls CLI output (text/json). --content-format controls content format (plain/markdown/djot/html). The older --output-format is a deprecated alias that still works but prints a warning — prefer --content-format.
- Node.js extractFile signature:
extractFile(path, mimeType?, config?) — mimeType is the second arg (pass null to skip).
- Python detect_mime_type: The function for detecting from bytes is
detect_mime_type(data). For paths use detect_mime_type_from_path(path).
- Config file field names: Use snake_case in TOML/YAML/JSON config files. The Rust
[chunking] fields are max_characters and overlap (with max_chars / max_overlap accepted as aliases). Other fields use names like output_format, pdf_options.
Supported Formats (Summary)
| Category |
Extensions |
| PDF |
.pdf |
| Word |
.docx, .odt |
| Spreadsheets |
.xlsx, .xlsm, .xlsb, .xls, .xla, .xlam, .xltm, .ods |
| Presentations |
.pptx, .ppt, .ppsx |
| eBooks |
.epub, .fb2 |
| Images |
.png, .jpg, .jpeg, .gif, .webp, .bmp, .tiff, .tif, .jp2, .jpx, .jpm, .mj2, .jbig2, .jb2, .pnm, .pbm, .pgm, .ppm, .svg |
| Markup |
.html, .htm, .xhtml, .xml |
| Data |
.json, .yaml, .yml, .toml, .csv, .tsv |
| Text |
.txt, .md, .markdown, .djot, .rst, .org, .rtf |
| Email |
.eml, .msg |
| Archives |
.zip, .tar, .tgz, .gz, .7z |
| Academic |
.bib, .biblatex, .ris, .nbib, .enw, .csl, .tex, .latex, .typ, .jats, .ipynb, .docbook, .opml, .pod, .mdoc, .troff |
See references/supported-formats.md for the complete format reference with MIME types.
Additional Resources
Detailed reference files for specific topics:
- Python API Reference — All functions, config classes, plugin protocols, exact signatures
- Node.js API Reference — All functions, TypeScript interfaces, worker pool APIs
- Rust API Reference — All functions with feature gates, structs, Cargo.toml examples
- CLI Reference — All commands, flags, config precedence, exit codes
- Configuration Reference — TOML/YAML/JSON formats, auto-discovery, env vars, full schema
- Supported Formats — All 91+ formats with file extensions and MIME types
- Advanced Features — Plugins, embeddings, MCP server, API server, security limits
- Other Language Bindings — Go, Ruby, Java, C#, PHP, Elixir, WASM, Docker
Related skills
Task-focused sibling skills go deeper than this overview:
- extracting-with-ocr — OCR backends, language packs, force-OCR, tuning.
- extracting-tables — layout-aware table detection and table models.
- chunking — chunk size/overlap, markdown/yaml/semantic chunkers, the
chunk command.
- extracting-keywords — YAKE/RAKE keywords, language detection, the
embed command.
- batch-extraction — the
batch command, --file-configs, parallelism, error recovery.
- picking-a-format — choosing
--format / --content-format per consumer.
Full documentation: https://docs.kreuzberg.dev
GitHub: https://github.com/kreuzberg-dev/kreuzberg
Source: hashgraph-online/awesome-codex-plugins → plugins/kreuzberg-dev/plugins/plugins/kreuzberg/skills/kreuzberg/SKILL.md
1---2name: kreuzberg3description: >- Extract text, tables, metadata, and images from 91+ document formats (PDF, Office, images, HTML, email, archives, academic) using Kreuzberg. Use when writing code that calls Kreuzberg APIs in Python, Node.js/TypeScript, Rust, or CLI. Covers installation, extraction (sync/async), configuration (OCR, chunking, output format), batch processing, error handling, and plugins.4---567# Kreuzberg Document Extraction89Kreuzberg is a high-performance document intelligence library with a Rust core and native bindings for Python, Node.js/TypeScript, Ruby, Go, Java, C#, PHP, and Elixir. It extracts text, tables, metadata, and images from 91+ file formats including PDF, Office documents, images (with OCR), HTML, email, archives, and academic formats.1011Use this skill when writing code that:1213- Extracts text or metadata from documents14- Performs OCR on scanned documents or images15- Batch-processes multiple files16- Configures extraction options (output format, chunking, OCR, language detection)17- Implements custom plugins (post-processors, validators, OCR backends)1819> If the `kreuzberg` MCP server is registered in this session, prefer its tools over shelling out to the CLI — they expose the same extraction surface with structured arguments and results.2021## Installation2223### Python2425```bash26pip install kreuzberg27# Optional OCR backends:28pip install kreuzberg[easyocr] # EasyOCR29```3031### Node.js3233```bash34npm install @kreuzberg/node35```3637### Rust3839```toml40# Cargo.toml41[dependencies]42kreuzberg = { version = "4", features = ["tokio-runtime"] }43# features: tokio-runtime (required for sync + batch), pdf, ocr, chunking,44# embeddings, language-detection, keywords-yake, keywords-rake45```4647### CLI4849```bash50brew install kreuzberg-dev/tap/kreuzberg51# or run without a persistent install (the CLI proxy package self-installs the binary):52npx @kreuzberg/kreuzberg-cli --help53uvx --from kreuzberg-cli kreuzberg --help54# or download a prebuilt binary from the latest GitHub release:55# https://github.com/kreuzberg-dev/kreuzberg/releases/latest56# or build from source:57cargo install --git https://github.com/kreuzberg-dev/kreuzberg kreuzberg-cli58```5960## Quick Start6162### Python (Async)6364```python65from kreuzberg import extract_file6667result = await extract_file("document.pdf")68print(result.content) # extracted text69print(result.metadata) # document metadata70print(result.tables) # extracted tables71```7273### Python (Sync)7475```python76from kreuzberg import extract_file_sync7778result = extract_file_sync("document.pdf")79print(result.content)80```8182### Node.js8384```typescript85import { extractFile } from "@kreuzberg/node";8687const result = await extractFile("document.pdf");88console.log(result.content);89console.log(result.metadata);90console.log(result.tables);91```9293### Node.js (Sync)9495```typescript96import { extractFileSync } from "@kreuzberg/node";9798const result = extractFileSync("document.pdf");99```100101### Rust (Async)102103```rust104use kreuzberg::{extract_file, ExtractionConfig};105106#[tokio::main]107async fn main() -> kreuzberg::Result<()> {108 let config = ExtractionConfig::default();109 let result = extract_file("document.pdf", None, &config).await?;110 println!("{}", result.content);111 Ok(())112}113```114115### Rust (Sync) — requires `tokio-runtime` feature116117```rust118use kreuzberg::{extract_file_sync, ExtractionConfig};119120fn main() -> kreuzberg::Result<()> {121 let config = ExtractionConfig::default();122 let result = extract_file_sync("document.pdf", None, &config)?;123 println!("{}", result.content);124 Ok(())125}126```127128### CLI129130```bash131kreuzberg extract document.pdf132kreuzberg extract document.pdf --format json133kreuzberg extract document.pdf --content-format markdown134```135136## Configuration137138All languages use the same configuration structure with language-appropriate naming conventions.139140### Python (snake_case)141142```python143from kreuzberg import (144 ExtractionConfig, OcrConfig, TesseractConfig,145 PdfConfig, ChunkingConfig,146)147148config = ExtractionConfig(149 ocr=OcrConfig(150 backend="tesseract",151 language="eng",152 tesseract_config=TesseractConfig(psm=6, enable_table_detection=True),153 ),154 pdf_options=PdfConfig(passwords=["secret123"]),155 chunking=ChunkingConfig(max_chars=1000, max_overlap=200),156 output_format="markdown",157)158159result = await extract_file("document.pdf", config=config)160```161162### Node.js (camelCase)163164```typescript165import { extractFile, type ExtractionConfig } from "@kreuzberg/node";166167const config: ExtractionConfig = {168 ocr: { backend: "tesseract", language: "eng" },169 pdfOptions: { passwords: ["secret123"] },170 chunking: { maxChars: 1000, maxOverlap: 200 },171 outputFormat: "markdown",172};173174const result = await extractFile("document.pdf", null, config);175```176177### Rust (snake_case)178179```rust180use kreuzberg::{ExtractionConfig, OcrConfig, ChunkingConfig, OutputFormat};181182let config = ExtractionConfig {183 ocr: Some(OcrConfig {184 backend: "tesseract".into(),185 language: "eng".into(),186 ..Default::default()187 }),188 chunking: Some(ChunkingConfig {189 max_characters: 1000,190 overlap: 200,191 ..Default::default()192 }),193 output_format: OutputFormat::Markdown,194 ..Default::default()195};196197let result = extract_file("document.pdf", None, &config).await?;198```199200### Config File (TOML)201202```toml203output_format = "markdown"204205[ocr]206backend = "tesseract"207language = "eng"208209[chunking]210max_characters = 1000211overlap = 200212213[pdf_options]214passwords = ["secret123"]215```216217```bash218# CLI: auto-discovers kreuzberg.toml in current/parent directories219kreuzberg extract doc.pdf220# or explicit:221kreuzberg extract doc.pdf --config kreuzberg.toml222kreuzberg extract doc.pdf --config-json '{"ocr":{"backend":"tesseract","language":"deu"}}'223```224225## Batch Processing226227### Python228229```python230from kreuzberg import batch_extract_files, batch_extract_files_sync231232# Async233results = await batch_extract_files(["doc1.pdf", "doc2.docx", "doc3.xlsx"])234235# Sync236results = batch_extract_files_sync(["doc1.pdf", "doc2.docx"])237238for result in results:239 print(f"{len(result.content)} chars extracted")240```241242### Node.js243244```typescript245import { batchExtractFiles } from "@kreuzberg/node";246247const results = await batchExtractFiles(["doc1.pdf", "doc2.docx"]);248```249250### Rust — requires `tokio-runtime` feature251252```rust253use kreuzberg::{batch_extract_file, ExtractionConfig};254255let config = ExtractionConfig::default();256let paths = vec!["doc1.pdf", "doc2.docx"];257let results = batch_extract_file(paths, &config).await?;258```259260### CLI261262```bash263kreuzberg batch *.pdf --format json264kreuzberg batch docs/*.docx --content-format markdown265```266267## OCR268269OCR runs automatically for images and scanned PDFs. Tesseract is the default backend (native binding, no external install required).270271### Backends272273- **Tesseract** (default): Built-in native binding. All Tesseract languages supported.274- **EasyOCR** (Python only): `pip install kreuzberg[easyocr]`. Pass `easyocr_kwargs={"gpu": True}`.275- **PaddleOCR** (Python only): Bundled since 4.8.5, no extra install needed. Pass `paddleocr_kwargs={"use_angle_cls": True}`.276- **Guten** (Node.js only): Built-in OCR backend via `GutenOcrBackend`.277278### Language Codes279280```python281config = ExtractionConfig(ocr=OcrConfig(language="eng")) # English282config = ExtractionConfig(ocr=OcrConfig(language="eng+deu")) # Multiple283config = ExtractionConfig(ocr=OcrConfig(language="all")) # All installed284```285286### Force OCR287288```python289config = ExtractionConfig(force_ocr=True) # OCR even if text is extractable290```291292## ExtractionResult Fields293294| Field | Python | Node.js | Rust | Description |295| ------------ | --------------------------- | -------------------------- | --------------------------- | --------------------------------------------- |296| Text content | `result.content` | `result.content` | `result.content` | Extracted text (str/String) |297| MIME type | `result.mime_type` | `result.mimeType` | `result.mime_type` | Input document MIME type |298| Metadata | `result.metadata` | `result.metadata` | `result.metadata` | Document metadata (dict/object/HashMap) |299| Tables | `result.tables` | `result.tables` | `result.tables` | Extracted tables with cells + markdown |300| Languages | `result.detected_languages` | `result.detectedLanguages` | `result.detected_languages` | Detected languages (if enabled) |301| Chunks | `result.chunks` | `result.chunks` | `result.chunks` | Text chunks (if chunking enabled) |302| Images | `result.images` | `result.images` | `result.images` | Extracted images (if enabled) |303| Elements | `result.elements` | `result.elements` | `result.elements` | Semantic elements (if element_based format) |304| Pages | `result.pages` | `result.pages` | `result.pages` | Per-page content (if page extraction enabled) |305| Keywords | `result.keywords` | `result.keywords` | `result.keywords` | Extracted keywords (if enabled) |306307## Error Handling308309### Python310311```python312from kreuzberg import (313 extract_file_sync, KreuzbergError, ParsingError,314 OCRError, ValidationError, MissingDependencyError,315)316317try:318 result = extract_file_sync("file.pdf")319except ParsingError as e:320 print(f"Failed to parse: {e}")321except OCRError as e:322 print(f"OCR failed: {e}")323except ValidationError as e:324 print(f"Invalid input: {e}")325except MissingDependencyError as e:326 print(f"Missing dependency: {e}")327except KreuzbergError as e:328 print(f"Extraction failed: {e}")329```330331### Node.js332333```typescript334import {335 extractFile,336 KreuzbergError,337 ParsingError,338 OcrError,339 ValidationError,340 MissingDependencyError,341} from "@kreuzberg/node";342343try {344 const result = await extractFile("file.pdf");345} catch (e) {346 if (e instanceof ParsingError) {347 /* ... */348 } else if (e instanceof OcrError) {349 /* ... */350 } else if (e instanceof ValidationError) {351 /* ... */352 } else if (e instanceof KreuzbergError) {353 /* ... */354 }355}356```357358### Rust359360```rust361use kreuzberg::{extract_file, ExtractionConfig, KreuzbergError};362363let config = ExtractionConfig::default();364match extract_file("file.pdf", None, &config).await {365 Ok(result) => println!("{}", result.content),366 Err(KreuzbergError::Parsing(msg)) => eprintln!("Parse error: {msg}"),367 Err(KreuzbergError::Ocr(msg)) => eprintln!("OCR error: {msg}"),368 Err(e) => eprintln!("Error: {e}"),369}370```371372## Common Pitfalls3733741. **Python ChunkingConfig fields**: Use `max_chars` and `max_overlap`, NOT `max_characters` or `overlap`.3752. **Rust extract_file signature**: Third argument is `&ExtractionConfig` (a reference), not `Option`. Use `&ExtractionConfig::default()` for defaults.3763. **Rust feature gates**: `extract_file_sync`, `batch_extract_file`, and `batch_extract_file_sync` all require `features = ["tokio-runtime"]` in Cargo.toml.3774. **Rust async context**: `extract_file` is async. Use `#[tokio::main]` or call from an async context.3785. **CLI --format vs --content-format**: `--format` controls CLI output (text/json). `--content-format` controls content format (plain/markdown/djot/html). The older `--output-format` is a deprecated alias that still works but prints a warning — prefer `--content-format`.3796. **Node.js extractFile signature**: `extractFile(path, mimeType?, config?)` — mimeType is the second arg (pass `null` to skip).3807. **Python detect_mime_type**: The function for detecting from bytes is `detect_mime_type(data)`. For paths use `detect_mime_type_from_path(path)`.3818. **Config file field names**: Use snake_case in TOML/YAML/JSON config files. The Rust `[chunking]` fields are `max_characters` and `overlap` (with `max_chars` / `max_overlap` accepted as aliases). Other fields use names like `output_format`, `pdf_options`.382383## Supported Formats (Summary)384385| Category | Extensions |386| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |387| **PDF** | `.pdf` |388| **Word** | `.docx`, `.odt` |389| **Spreadsheets** | `.xlsx`, `.xlsm`, `.xlsb`, `.xls`, `.xla`, `.xlam`, `.xltm`, `.ods` |390| **Presentations** | `.pptx`, `.ppt`, `.ppsx` |391| **eBooks** | `.epub`, `.fb2` |392| **Images** | `.png`, `.jpg`, `.jpeg`, `.gif`, `.webp`, `.bmp`, `.tiff`, `.tif`, `.jp2`, `.jpx`, `.jpm`, `.mj2`, `.jbig2`, `.jb2`, `.pnm`, `.pbm`, `.pgm`, `.ppm`, `.svg` |393| **Markup** | `.html`, `.htm`, `.xhtml`, `.xml` |394| **Data** | `.json`, `.yaml`, `.yml`, `.toml`, `.csv`, `.tsv` |395| **Text** | `.txt`, `.md`, `.markdown`, `.djot`, `.rst`, `.org`, `.rtf` |396| **Email** | `.eml`, `.msg` |397| **Archives** | `.zip`, `.tar`, `.tgz`, `.gz`, `.7z` |398| **Academic** | `.bib`, `.biblatex`, `.ris`, `.nbib`, `.enw`, `.csl`, `.tex`, `.latex`, `.typ`, `.jats`, `.ipynb`, `.docbook`, `.opml`, `.pod`, `.mdoc`, `.troff` |399400See [references/supported-formats.md](references/supported-formats.md) for the complete format reference with MIME types.401402## Additional Resources403404Detailed reference files for specific topics:405406- **[Python API Reference](references/python-api.md)** — All functions, config classes, plugin protocols, exact signatures407- **[Node.js API Reference](references/nodejs-api.md)** — All functions, TypeScript interfaces, worker pool APIs408- **[Rust API Reference](references/rust-api.md)** — All functions with feature gates, structs, Cargo.toml examples409- **[CLI Reference](references/cli-reference.md)** — All commands, flags, config precedence, exit codes410- **[Configuration Reference](references/configuration.md)** — TOML/YAML/JSON formats, auto-discovery, env vars, full schema411- **[Supported Formats](references/supported-formats.md)** — All 91+ formats with file extensions and MIME types412- **[Advanced Features](references/advanced-features.md)** — Plugins, embeddings, MCP server, API server, security limits413- **[Other Language Bindings](references/other-bindings.md)** — Go, Ruby, Java, C#, PHP, Elixir, WASM, Docker414415## Related skills416417Task-focused sibling skills go deeper than this overview:418419- **extracting-with-ocr** — OCR backends, language packs, force-OCR, tuning.420- **extracting-tables** — layout-aware table detection and table models.421- **chunking** — chunk size/overlap, markdown/yaml/semantic chunkers, the `chunk` command.422- **extracting-keywords** — YAKE/RAKE keywords, language detection, the `embed` command.423- **batch-extraction** — the `batch` command, `--file-configs`, parallelism, error recovery.424- **picking-a-format** — choosing `--format` / `--content-format` per consumer.425426Full documentation: <https://docs.kreuzberg.dev>427GitHub: <https://github.com/kreuzberg-dev/kreuzberg>428429---430431**Source:** [`hashgraph-online/awesome-codex-plugins`](https://github.com/hashgraph-online/awesome-codex-plugins) → `plugins/kreuzberg-dev/plugins/plugins/kreuzberg/skills/kreuzberg/SKILL.md`