first-fluke/oma-pdf
> Convert PDF files to Markdown using opendataloader-pdf. Extracts text, tables, headings, lists, and images with correct reading order. Use for PDF parsing, PDF to Markdown conversion, document extraction, and AI-ready data preparation.
npx skills add https://github.com/first-fluke/oh-my-agent --skill oma-pdf
Convert PDF files into structured Markdown or another requested extraction format while preserving readable document structure for LLM context, RAG, or downstream review.
input_path: PDF file or folder pathoutput_dir: optional target directoryformat: optional output format, default markdownocr_languages: optional OCR language list for scanned or image-based PDFsextraction_options: optional flags for tagged structure, image extraction, or hybrid conversionuvx opendataloader-pdf for standard conversionuvx --from "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid for OCR or hybrid conversion (the hybrid server is a console script of the [hybrid] extra, not a standalone package)uvx mdformat for Markdown normalizationuvxoutput_dir and the expected output filename.mdformat for Markdown output and inspect the result for readable structure.--use-struct-tree.--table-method cluster or --markdown-with-html before escalating to hybrid mode.--to-stdout) so repeated runs do not overwrite the same basename.| Failure | Recovery |
|---------|----------|
| uvx unavailable | Ask user to install uv before conversion |
| opendataloader-pdf-hybrid not found | Invoke via uvx --from "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid; the bare package name does not exist on PyPI |
| Password-protected PDF | Ask for password or unlocked PDF |
| Garbled output | Retry with tagged structure or hybrid mode |
| Missing tables | Retry with --table-method cluster or --markdown-with-html first; hybrid mode for scanned tables |
| OCR language mismatch | Retry with explicit OCR languages, for example ko,en |
| Large file or memory pressure | Split into page ranges using distinct output directories or --to-stdout; never reuse one output directory for the same basename |
| Action | SSL primitive | Evidence |
|--------|---------------|----------|
| Validate path and options | VALIDATE | Input preflight in execution protocol |
| Probe text layer | READ | Text preview extraction |
| Choose conversion strategy | SELECT | Standard, tagged, or hybrid mode decision |
| Run converter | CALL_TOOL | uvx opendataloader-pdf |
| Start OCR server | CALL_TOOL | uvx --from "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid |
| Write output artifact | WRITE | Markdown, text, JSON, or HTML output |
| Normalize Markdown | CALL_TOOL | uvx mdformat |
| Inspect extraction quality | VALIDATE | Structure/readability verification |
| Report result | NOTIFY | Final user-facing summary |
opendataloader-pdf: primary PDF extraction CLIopendataloader-pdf-hybrid: hybrid OCR and complex extraction pathmdformat: Markdown normalizationfile, wc, or pdfinfo may be used for preflight when availableuvx opendataloader-pdf "{input_path}" -f text --pages 1-3 --to-stdout -q # text-layer probe (no temp files)
uvx opendataloader-pdf "{input_path}" --format markdown --output-dir "{output_dir}"
uvx mdformat "{output_path}"
For scanned/image-based PDFs, start OCR first and then convert through hybrid mode:
uvx --from "opendataloader-pdf[hybrid]" opendataloader-pdf-hybrid --port 5002 --force-ocr --ocr-lang "{languages}"
uvx opendataloader-pdf --hybrid docling-fast --hybrid-mode full "{input_path}" --format markdown --output-dir "{output_dir}"
On-request flags — --sanitize (PII masking), --pages (range extraction), --threads (parallel pages), --detect-strikethrough, hybrid --enrich-formula / --enrich-picture-description — are detailed in resources/execution-protocol.md. The two enrichment flags require client-side --hybrid-mode full.
| Scope | Resource target |
|-------|-----------------|
| LOCAL_FS | Input PDFs and generated output files |
| PROCESS | uvx subprocesses and optional hybrid server |
| MEMORY | Extracted previews and validation notes |
| OTHER | OCR model/runtime behavior inside hybrid mode |
uvx.config/pdf-config.yaml; explicit user options override them, and output.overwrite: false requires confirmation before replacing an existing output file.resources/execution-protocol.md rather than duplicating every variant here.resources/execution-protocol.mdconfig/pdf-config.yaml../_shared/core/context-loading.md../_shared/core/quality-principles.mdTake first-fluke/oma-pdf from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference uvx.
Without those the skill loads but fails at the first command.