agentleFS
Sign inSign up

mineru-pdf-to-md

Tano73/agent-skills/skills/mineru-pdf-to-md/SKILL.md

Converte PDF e immagini in Markdown ad alta fedeltà usando MinerU con il modello VLM MinerU2.5-Pro (opendatalab/MinerU2.5-Pro-2604-1.2B), preservando layout, tabelle, formule ed estraendo le immagini. Usa SEMPRE questa skill quando l'utente vuole "convertire un PDF in Markdown", "estrarre il testo da un PDF", "parsare/leggere un PDF", "pdf to md", "OCR di un documento scansionato", "trasformare una scansione in testo", oppure quando nomina esplicitamente "MinerU", "MinerU2.5", "magic-pdf" o "mineru". Attiva anche quando l'utente chiede di rendere un PDF (paper, manuale, capitolato, bilancio, contratto) processabile da un LLM, indicizzabile per RAG o leggibile come testo, anche senza dire "Markdown". NON usare per: convertire DOCX/HTML/EPUB tra formati testuali (usa pandoc-convert), generare un PDF a partire da Markdown, compilare o unire PDF, o spezzare un Markdown già esistente in capitoli (usa markdown-chapter-splitter).

Skill2 starsChanged 19 days ago
---
name: mineru-pdf-to-md
description: >
  Converte PDF e immagini in Markdown ad alta fedeltà usando MinerU con il modello VLM
  MinerU2.5-Pro (opendatalab/MinerU2.5-Pro-2604-1.2B), preservando layout, tabelle, formule
  ed estraendo le immagini. Usa SEMPRE questa skill quando l'utente vuole "convertire un PDF
  in Markdown", "estrarre il testo da un PDF", "parsare/leggere un PDF", "pdf to md",
  "OCR di un documento scansionato", "trasformare una scansione in testo", oppure quando
  nomina esplicitamente "MinerU", "MinerU2.5", "magic-pdf" o "mineru". Attiva anche quando
  l'utente chiede di rendere un PDF (paper, manuale, capitolato, bilancio, contratto)
  processabile da un LLM, indicizzabile per RAG o leggibile come testo, anche senza dire
  "Markdown". NON usare per: convertire DOCX/HTML/EPUB tra formati testuali (usa
  pandoc-convert), generare un PDF a partire da Markdown, compilare o unire PDF, o
  spezzare un Markdown già esistente in capitoli (usa markdown-chapter-splitter).
---

# MinerU PDF → Markdown

MinerU converte documenti a layout complesso in Markdown pulito. Il suo modello di punta è
**MinerU2.5-Pro-2604-1.2B**, un VLM che legge la pagina come immagine e ne ricostruisce la
struttura: ordine di lettura, tabelle in HTML, formule in LaTeX, figure ritagliate su file.

Questo lo rende adatto dove un estrattore di testo tradizionale fallisce — PDF a due colonne,
scansioni, paper scientifici, capitolati con tabelle annidate — ma comporta un vincolo
concreto: **il VLM ha bisogno di una GPU o di un server remoto**. Il primo compito della
skill è quindi capire dove può girare, non lanciare subito la conversione.

**Script:**
- `$HOME/.agents/skills/mineru-pdf-to-md/scripts/mineru_env.py` — diagnosi ambiente e installazione
- `$HOME/.agents/skills/mineru-pdf-to-md/scripts/mineru_convert.py` — conversione, normalizzazione output, report qualità

---

## Fase 0 — Diagnosi dell'ambiente

Esegui sempre questo comando prima di qualsiasi conversione. È veloce e determina tutto il resto:

```bash
python3 $HOME/.agents/skills/mineru-pdf-to-md/scripts/mineru_env.py check
```

Lo script rileva GPU CUDA, Apple Silicon, un eventuale server VLM (variabili d'ambiente
`MINERU_SERVER_URL` o `MINERU_VLM_SERVER_URL`) e la presenza di `mineru`, poi raccomanda un backend.

| Situazione rilevata | Backend scelto | Usa MinerU2.5-Pro? |
|---|---|---|
| Server OpenAI-compatibile raggiungibile | `vlm-http-client` | Sì, in remoto |
| GPU CUDA ≥ 8 GB VRAM o Apple Silicon | `hybrid-auto-engine` | Sì, in locale |
| Solo CPU, nessun server | `pipeline` | **No** |

### Il caso CPU va dichiarato all'utente

Se la raccomandazione è `pipeline`, la conversione funzionerà comunque — MinerU ha una pipeline
classica (layout detection + OCR) che gira bene su CPU — ma **MinerU2.5-Pro non viene usato**, e
tabelle e formule risultano sensibilmente più deboli. Siccome l'utente ha probabilmente chiesto
proprio quel modello, non silenziare la differenza: spiega il fallback e presenta le alternative
reali (procedere con `pipeline`, puntare a un server remoto con `--server-url`, oppure forzare
`vlm-auto-engine` su CPU, che usa davvero MinerU2.5-Pro ma impiega diversi minuti a pagina).

---

## Fase 1 — Installazione, se serve

Se `mineru_env.py check` riporta `mineru: not installed`, **chiedi conferma prima di installare**:
l'installazione crea un virtualenv in `~/.mineru-venv` e scarica pacchetti che nel profilo GPU
pesano diversi GB.

Mostra all'utente cosa verrà fatto:

```bash
python3 $HOME/.agents/skills/mineru-pdf-to-md/scripts/mineru_env.py install --profile auto --dry-run
```

Poi, dopo l'ok, esegui senza `--dry-run`. I profili corrispondono ai backend:

| Profilo | Pacchetti | Peso indicativo | Per |
|---|---|---|---|
| `client` | `mineru` | pochi MB | `vlm-http-client` verso un server remoto |
| `pipeline` | `mineru[pipeline]` | ~2 GB | CPU locale, backend `pipeline` |
| `gpu` | `mineru[core,vllm]` | diversi GB | VLM locale con GPU |

Al primo avvio MinerU scarica anche i pesi del modello da Hugging Face. Se la rete blocca HF,
imposta `MINERU_MODEL_SOURCE=modelscope`.

---

## Fase 2 — Conversione

Un solo comando per il caso normale:

```bash
python3 $HOME/.agents/skills/mineru-pdf-to-md/scripts/mineru_convert.py "<input.pdf>"
```

Lo script sceglie il backend (`--backend auto`), lancia `mineru`, appiattisce l'output e
produce il report qualità. Stampa sempre il comando `mineru` che sta eseguendo, così l'utente
vede cosa succede davvero.

### Layout dell'output

MinerU scrive un albero annidato con parecchi artefatti di debug. Lo script normalizza a:

```
<cartella-del-pdf>/<nome>-md/
├── <nome>.md
└── images/          # figure e tabelle ritagliate, referenziate dal Markdown
```

Il Markdown referenzia le immagini con path relativi `images/…`, quindi la cartella va spostata
insieme al `.md`. Usa `-o <dir>` per una destinazione diversa e `--keep-raw` se servono anche
`middle.json`, `content_list.json` e i PDF di visualizzazione layout.

### Opzioni utili

| Opzione | Quando |
|---|---|
| `-o <dir>` | destinazione diversa dal default accanto al sorgente |
| `-b <backend>` | forzare un backend contro la raccomandazione automatica |
| `--server-url http://host:30000` | server VLM non esposto via variabile d'ambiente |
| `-s N -e M` | solo le pagine da N a M (0-based) — utile per provare un documento lungo |
| `--lang <script>` | solo per script non latini, e solo con backend `pipeline` |
| `--keep-raw` | conservare JSON intermedi per elaborazioni successive |
| `--json` | output strutturato, utile se devi incatenare altri passi |

### Lingua e OCR

Italiano e inglese **non richiedono `--lang`**: lo script latino è il default. Il flag serve solo
per cinese, coreano, arabo, cirillico, greco, thai, devanagari e simili, ed è ignorato dai backend
`vlm-*` (il VLM riconosce la lingua da solo). Se l'utente chiede "OCR in italiano", rassicuralo:
non serve nessuna opzione.

### Documenti lunghi

Prima di lanciare un PDF da centinaia di pagine, converti un campione con `-s 0 -e 4` e mostra
il risultato. Se il campione è buono si prosegue; se no si è risparmiato molto tempo. Su CPU con
backend `pipeline` conta indicativamente qualche secondo a pagina, con `vlm-auto-engine` minuti.

---

## Fase 3 — Verifica e consegna

Il report qualità viene stampato automaticamente. Non limitarti a incollarlo: **interpretalo**.

```
=== MinerU quality report ===
Characters:     23,926
Pages:          84 with content / 85 requested (source has 85)
Text coverage:  14% of the source text layer
Tables:         17 HTML + 0 Markdown
Formula blocks: 12
Images:         14 referenced, 0 missing
  ! CONTENT LOST on 1 page(s): [3] — the source has text there but the parse produced nothing
  ! only 14% of the text in the source's own text layer made it into the Markdown
```

Il controllo più importante è **Text coverage**: se il PDF ha un proprio layer di testo, lo script
lo estrae e lo usa come metro di paragone. Una copertura del 14% significa che sei sesti del
documento non sono arrivati nel Markdown, e nulla nell'exit status di `mineru` lo direbbe. Il dato
compare solo quando esiste un riferimento: per una scansione (layer di testo vuoto) non ha senso e
viene omesso, quindi la sua assenza non è una promozione. Serve `pypdf` importabile dal `python3`
di sistema; se manca, il controllo si disattiva in silenzio e resta solo la densità di testo.

Cosa fare per ciascun segnale:

- **`CONTENT LOST`** — pagine che nel sorgente contengono testo ma nel Markdown no. È il segnale
  più grave: c'è perdita reale. Se sono poche, riconvertile da sole (`-s 17 -e 17`) e reinseriscile
  al posto giusto: spesso al secondo tentativo escono, e consegnare un documento completo vale la
  spesa di un comando in più. Se non escono nemmeno così, dillo invece di consegnare in silenzio.
- **Copertura < 60%** — stesso discorso su scala di documento. Il file non è affidabile per RAG.
  Attenzione a non liquidarlo come "è il backend `pipeline`, si sa che è più debole": `pipeline`
  perde qualità su tabelle e formule, non i cinque sesti del testo. Una copertura del 15% significa
  che qualcosa è rotto — installazione incompleta, PDF protetto, pagine renderizzate come immagini
  — e indicare la causa sbagliata manda l'utente a comprare una GPU per un problema che non è quello.
- **Pagine vuote anche nel sorgente** — frontespizi e separatori: rumore, non problema. Lo script
  lo distingue da solo, non serve che tu riapra il PDF.
- **Markdown quasi vuoto** (< 200 caratteri) — quasi sempre una scansione che il backend non ha
  letto: con `pipeline` verifica che l'OCR sia attivo, meglio ancora passa a un backend VLM.
- **Immagini mancanti** — la cartella `images/` non è stata copiata o è stata spostata senza il
  `.md`. Verifica il percorso.
- **Densità di testo bassa** — segnalata solo quando manca un riferimento di copertura. Apri il
  Markdown e confronta una pagina con l'originale.
- **Avviso backend `pipeline`** — ricordalo nel messaggio finale, così l'utente sa che la qualità
  su tabelle e formule non è quella di MinerU2.5-Pro.

Prima di attribuire un difetto alla conversione, controlla il sorgente. È facile scambiare per
errore di parsing qualcosa che era già così nell'originale — una parola senza accento, una tabella
storta, una sigla strana — e segnalare difetti inesistenti erode la fiducia nel report tanto
quanto tacere quelli veri.

Confronta anche il profilo del documento con come l'utente te l'ha descritto. Se ha parlato di un
capitolato pieno di tabelle e il report ne conta due, o se il titolo estratto non c'entra con
quello che si aspettava, quasi sempre ha indicato il file sbagliato — una copia vecchia, un
download interrotto, un omonimo nella cartella. Dirglielo prima che costruisca qualcosa sopra il
file sbagliato vale molto più che consegnare in silenzio.

Per rifare solo il controllo su un output già prodotto:

```bash
python3 $HOME/.agents/skills/mineru-pdf-to-md/scripts/mineru_convert.py \
  --check-only "<dir>-md" --source "<input.pdf>"
```

Chiudi comunicando: percorso del `.md`, backend usato, se MinerU2.5-Pro è stato coinvolto, e le
eventuali anomalie con la tua interpretazione.

---

## Errori frequenti

| Sintomo | Causa e rimedio |
|---|---|
| `mineru not found` | Non installato o venv diverso: Fase 1, oppure `--venv <path>` |
| `backend … needs a server URL` | Backend http-client senza endpoint: passa `--server-url` |
| `mineru produced no Markdown` | Parsing fallito a monte: rilancia con `--keep-raw` e leggi l'output di `mineru` |
| Download modello lentissimo o in errore | `export MINERU_MODEL_SOURCE=modelscope` |
| OOM / processo killato su CPU | `vlm-auto-engine` non sta nella RAM: usa `pipeline` o un server remoto |
| PDF protetto da password | MinerU non lo apre: chiedi all'utente una copia senza protezione |

---

## Confini con le altre skill

- **pandoc-convert** — conversioni tra formati testuali strutturati (DOCX, HTML, EPUB, MD). Un
  DOCX ha già la struttura: non serve un VLM.
- **markdown-chapter-splitter** — parte da un Markdown esistente. Se l'utente vuole convertire
  *e poi* spezzare in capitoli, questa skill produce il `.md` e l'altra lo divide.
- **docling** — parser alternativo. Se MinerU non è installabile nell'ambiente e l'utente ha
  fretta, docling è un ripiego ragionevole: dillo invece di insistere.

Discussion

Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.

Posts are public.Sign in to post

No one has posted yet. Be the first.