# Collecteur de PDF officiels

Ce dossier contient un collecteur local pour repérer, télécharger et ranger les PDF officiels liés aux cycles 3 et 4 depuis des pages sources de l'État français, principalement éduscol.

Le script est volontairement prudent :

- il ne suit que les domaines listés dans `seeds.json` ;
- il limite la profondeur de crawl ;
- il fonctionne en `dry-run` par défaut ;
- il calcule un SHA256 pour éviter les doublons ;
- il range les fichiers par `Cycle 3` / `Cycle 4` puis par matière ;
- il met les cas ambigus dans `A_trier`.

## Lancer un test local

Depuis `Programme` :

```powershell
python .\pdf_collecteur\collect_official_pdfs.py --dry-run
```

Pour limiter le test à peu de pages :

```powershell
python .\pdf_collecteur\collect_official_pdfs.py --dry-run --max-depth 1 --limit-pages 20
```

Pour repartir d'un manifest/log vide pendant les essais :

```powershell
python .\pdf_collecteur\collect_official_pdfs.py --dry-run --fresh --max-depth 1 --limit-pages 20
```

Si Python échoue avec `CERTIFICATE_VERIFY_FAILED` sur Windows, utiliser temporairement :

```powershell
python .\pdf_collecteur\collect_official_pdfs.py --dry-run --insecure --max-depth 1 --limit-pages 20
```

## Télécharger les nouveaux PDF

```powershell
python .\pdf_collecteur\collect_official_pdfs.py --download
```

Sans `--download`, aucun PDF n'est écrit dans les dossiers `Cycle 3` / `Cycle 4`.

## Sorties

Le script écrit dans `pdf_collecteur/state/` :

- `manifest.csv` : catalogue des PDF vus/téléchargés ;
- `crawl_log.jsonl` : journal technique ligne par ligne ;
- `downloads_tmp/` : fichiers temporaires pendant le téléchargement.

## Ajouter des sources

Modifier `seeds.json` :

```json
{
  "url": "https://eduscol.education.fr/...",
  "cycle_hint": "Cycle 3",
  "subject_hint": "Math"
}
```

Les hints ne forcent pas le classement, mais ils servent de point d'appui quand le lien PDF est peu explicite.

## Déploiement VPS

Le script n'a pas de dépendance externe Python. Sur VPS :

```bash
cd /chemin/vers/Programme
python3 pdf_collecteur/collect_official_pdfs.py --dry-run --max-depth 2
python3 pdf_collecteur/collect_official_pdfs.py --download --max-depth 2
```

Pour automatiser, commencer avec un cron en `--dry-run`, relire `manifest.csv`, puis passer en `--download` quand les classements sont satisfaisants.

## Indexer les PDF avec Poppler

Après téléchargement, générer les textes et métadonnées dans le format historique :

```powershell
python .\pdf_collecteur\index_pdfs.py --fresh
```

Sur Windows avec Poppler installé via WinGet, utiliser plutôt le script PowerShell :

```powershell
.\pdf_collecteur\index_pdfs.ps1 -Fresh
```

Le résultat est écrit dans :

```text
extractions_pdf_indexed_global/
```

Format :

- `001.txt`, `002.txt`, etc. : texte extrait avec `pdftotext -layout`.
- `001.pdfinfo.txt`, `002.pdfinfo.txt`, etc. : métadonnées `pdfinfo`.
- `manifest.csv` : correspondance entre ID, chemin PDF source, hash et statut.

Pour inclure aussi les PDF placés à la racine de `Programme` :

```powershell
python .\pdf_collecteur\index_pdfs.py --fresh --include-root-pdfs
```
