MinerU on a Mac, tested on a real scanned PDF
1,949
of 1,955 scan words, read in order
Ten scanned pages in 41 seconds
41 s for 10 pages, Mac GPU
2.1 GB model download
- Run
pip install mineruin a fresh venv. -
Run
mineru-kit models download --tier standardonce. - Run mineru.sh below next to book.pdf. It writes book.md.
mineru.sh
# One time: pip install "mineru==4.2.1", then mineru-kit models download --tier standard (2 GB)
export MINERU_TELEMETRY_DISABLED=1 # usage telemetry is on by default
mineru server start
mineru config set parse_server.local.managed_tier standard
mineru config set parse_server.local.mode managed
mineru server restart
# Every file: without --pages, a PDF stops after page 10
mineru parse book.pdf --pages all --no-marker --wait 1800 -o book.md
MinerU 4 runs a background server. The parse command sends your file to it, on your own Mac.
Out of the box, it says no
With no models and no parse server, the first parse stopped after 2.1 seconds:
quality_tier_unavailable
The message offers --tier flash, --remote
or a local parse server. Remote uploads your file to mineru.net. I
used the local server.
It stops at page 10
Without --pages, mineru parse reads the
first 10 pages of a PDF. My 11-page file has a typed cover page, so
the last scan page fell off.
| Command | Pages | Words |
|---|---|---|
| Default | 1-10 | 1,779 |
--pages all |
1-11 | 1,949 |
Flash, basic and standard
Standard adds the MinerU2.5 vision model, in llama.cpp. The error calls flash a text-only preview, but it read the scan too.
| Tier | Words | Time |
|---|---|---|
| flash | 1,899 | 57 s |
| basic | 1,899 | 25 s |
| standard | 1,949 | 41 s |
Flash and basic wrote the same bytes.
--tier advanced stopped with
tier_mismatch on this server.
Small misses, page headers kept
Four of the 6 missed words were quote marks, moved or dropped. One was a dash, and one was "unloadin'", spelled out as "unloading'".
It keeps running heads and page numbers as text. Some became Markdown headings:
## THE UNCOMMON PRAYER-BOOK
German: 204 of 206 umlauts
The same command read 3 German pages in 25 s, with no language option.
| Model | Umlauts | Columns |
|---|---|---|
| MinerU, standard | 204 | 970 |
| LightOnOCR-3 | 202 | 961 |
| olmOCR-2 | 194 | 935 |
| PaddleOCR-VL | 188 | 956 |
The two-column page has 972 words.
Five words behind, 31 s faster
The same 10 scanned pages, scorer and Mac GPU:
| Model | Words | Time |
|---|---|---|
| LightOnOCR-2 | 1,954 | 72 s |
| olmOCR-2 | 1,954 | 77 s |
| MinerU, standard | 1,949 | 41 s |
| PaddleOCR-VL | 1,947 | 73 s |
MinerU and our Actor: 4 wins, 0 losses
Our Actor, from a file URL, with no install:
curl -s -X POST "https://api.apify.com/v2/acts/brasspage~pdf-ocr-to-markdown/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"documentUrls": ["https://api.apify.com/v2/key-value-stores/sTnmNrGoSsi7tLQvs/records/anythingllm-mixed-11-pages.pdf"]}' \
| jq -r '.[].markdown' > mixed.md
| Test | MinerU | Actor |
|---|---|---|
| Scan words in order | 1,949 | 1,874 |
| Typed cover words | 13 | 13 |
| Umlauts | 204 | 192 |
| Two columns, in order | 970 | 954 |
| Time, 11 pages | 65 s | 133 s |
The MinerU time starts from a stopped server. The Actor needs no install, no GPU and no model download. It costs $0.006 a page.
Apache 2.0, plus two terms
I read the license and the model cards before the install. Business use is free below 100 million monthly users and USD 20 million monthly revenue.
An online service built on MinerU must say that it uses MinerU. On a Mac, the default model file comes from a personal Hugging Face repo with no license file.
How I tested it
- Scan: the 10 pages of OCR in n8n, proofread Wikisource book scans, 1,955 true words. The 11-page file adds the 13-word typed cover page of AnythingLLM OCR.
- German: the 3 pages of Paperless-ngx OCR, 1,887 words, 206 umlauts. One page has two columns, 972 words.
- Score: true words found in order in book.md, with the scorer of the tessdata test. German: the scorer of Tesseract German.
- mineru 4.2.1 with torch 2.15.0 on an Apple Silicon Mac GPU, at the lowest priority, 2 CPU threads, one file at a time.
- Models: MinerU-4_models_torch revision 2b3afb8 (0.89 GB) and the MinerU2.5-Pro-2605-1.2B Q8_0 GGUF revision 9185688 (1.24 GB).
-
Times count the parse command with the server running, and
--forceso no run read a cached result. In the Actor table, the MinerU time also counts the server start. One run of each file. - The other model rows: the same files and scorer, on the same Mac, on November 12. They have their own pages.
- The Actor: two real runs earlier the same day, build 0.1.65, on the same files.
What I did not test
- The remote mineru.net service and its paid tiers.
- vLLM, LMDeploy or MLX instead of llama.cpp.
- The ONNX models of a Mac with an Intel CPU.
- Tables, math, handwriting and rotated pages.
Sources
Two ways to skip the work
Run it yourself. Our Apify Actor turns scanned PDFs into Markdown, tables included.
Or send us the scan. Tack, our AI, does the job for $29, up to 50 pages. First page free.
Questions people ask
Can MinerU run on a Mac?
Yes. On Apple Silicon, pip install mineru brings torch. Download the standard models and turn on the local parse server, and it uses the Mac GPU.
Why does MinerU stop at page 10?
mineru parse reads the first 10 pages of a PDF unless you add --pages all. On an 11-page file, the default dropped the last page.
Is MinerU free for commercial use?
Yes, below 100 million monthly users and USD 20 million monthly revenue. An online service built on it must say that it uses MinerU.