Installation¶
Prerequisites¶
- Python 3.12 or later.
- uv for the commands shown on this page.
Install the package¶
Install from PyPI:
To install with the Docling converter included:
The all extra currently installs the same set as docling.
Install from a checkout¶
-
Clone the repository and enter it:
-
Create the environment:
-
Run the CLI from the checkout:
-
Optional: install the checkout as a CLI that works outside the repository:
Commands installed¶
The package installs the same command under two names:
vexy-pdf3mdpdf3md
python -m vexy_pdf3md runs the same CLI.
Optional converters¶
PyMuPDF is installed with the package and works immediately for PDFs with a text
layer. The other converters are optional. The package looks for them on PATH, or,
for Docling, checks whether the docling Python package can be imported.
markit¶
Install from the upstream instructions.
vexy-pdf3md runs it as markit -q --no-images FILE.pdf. markit is the first choice
for text-layer PDFs and handles multi-column layouts.
pdf22md (macOS)¶
Build and install pdf22md. It provides PDFKit text extraction and Apple Vision OCR. It is the first choice for scanned PDFs when it is installed.
Tesseract¶
On macOS:
On other systems, install your distribution's Tesseract package.
Language models named by --lang that are not in the system tessdata folder are
downloaded from tessdata_fast into ~/.cache/vexy-pdf3md/tessdata on first use.
If XDG_CACHE_HOME is set, the cache is $XDG_CACHE_HOME/vexy-pdf3md/tessdata
instead. To work offline, install the language packs with your package manager, for
example:
Docling¶
From a checkout:
The extra requires docling>=2.126,<3 and pydantic>=2.12. The Docling adapter uses
Tesseract for OCR when tesseract is on PATH. Docling may download layout and table
models on first use.
Check what is available¶
vexy-pdf3md has no separate "list converters" command. To see which external tools
are on your PATH:
Automatic selection only uses converters that are installed. If you name a missing
converter with --strategies, that attempt fails and the next eligible converter is
tried (unless --fallback=False).