PdfScrapper
Navigateur visuel qui permet de sélectionner du texte sur des pages web et de l'accumuler dans un PDF, au fil de la navigation.
Fonctionnalités
-
Navigateur intégré (moteur Chromium via QtWebEngine) : barre d'adresse, précédent / suivant / recharger, session persistante (cookies/connexions conservées entre deux lancements).
-
Capture de texte (sélection manuelle) : sélectionnez du texte dans la page puis cliquez sur "➕ Ajouter la sélection au PDF" (ou
Ctrl+Shift+A). L'extrait est stocké avec le titre de la page, son URL et l'heure de capture. -
Capture de bloc au survol : le bloc de contenu sous le curseur (paragraphe, item de liste, section, article...) se surligne automatiquement quand le mode est actif ; un clic dessus l'ajoute directement au PDF, sans avoir à sélectionner le texte à la main. Deux façons de l'activer, combinables :
- Maintenir
Ctrlenfoncé dans la page : actif tant que la touche est tenue, désactivé dès qu'on la relâche (pratique pour capturer un bloc à la volée sans repasser par la souris ensuite). Ctrl+Shift+B(ou le bouton "🎯 Mode capture au survol") : reste actif en continu jusqu'à nouvelle bascule, y compris après avoir suivi un lien vers la page suivante.
Tant que le mode est actif (par l'une ou l'autre méthode), le clic normal (suivre les liens) est suspendu sur la page.
- Maintenir
-
Panneau latéral : liste des extraits capturés (réorganisables, supprimables, renommables), export du PDF final quand vous le souhaitez. Si un extrait est sélectionné dans la liste, chaque nouvelle capture s'insère juste à côté de lui — au-dessus ou en dessous selon la case à cocher "Insérer les nouvelles captures au-dessus de la sélection" (cochée par défaut = au-dessus) — et les captures suivantes continuent de s'enchaîner du même côté du repère sans avoir à re-sélectionner à chaque fois. Sans sélection, les captures s'accumulent simplement à la fin, quel que soit ce réglage.
-
Renommer un extrait : double-cliquez sur un extrait dans la liste (ou sélectionnez-le puis "✏️ Renommer") pour changer son titre affiché — utilisé aussi comme titre de section dans le PDF exporté.
-
Tableau des extraits : le panneau latéral affiche les extraits capturés dans un vrai tableau (colonnes Heure, Titre, Aperçu, Lien, avec en-tête), plutôt qu'une simple liste de texte.
-
Lier plusieurs extraits en un seul chapitre : quand un chapitre est réparti sur plusieurs pages web (donc plusieurs extraits capturés séparément), l'icône de la colonne Lien permet de relier un extrait au suivant dans le tableau — à la manière du maillon de chaîne entre calques adjacents dans GIMP. Les extraits reliés sont exportés comme une seule section dans le PDF : un seul titre (celui du premier extrait du groupe, toujours renommable) et une seule entrée de sommaire, sans saut de page entre eux. Les extraits qui suivent le premier d'un groupe sont repérés par un préfixe "↳" (colonne Titre, et onglet "Corriger le texte"). Deux extraits directement reliés ne peuvent pas être réordonnés (▲/▼) sans être déliés au préalable, pour éviter d'inverser silencieusement le sens du lien.
-
Aperçu et style du PDF ("🖌 Aperçu et style du PDF…") : fenêtre dédiée qui affiche un rendu en direct du PDF final (via QtPdf) pendant que vous ajustez les réglages, répartis en deux onglets :
- 🎨 Style : titre du document, format de page (A4/Letter), police globale (Helvetica/Times/Courier — s'applique à tout le document), taille du texte et des titres, couleur des titres, couleur du texte, couleur d'arrière-plan, marges, affichage ou non de l'URL/date sous chaque titre, saut de page entre extraits ou non, et inclusion d'un sommaire (voir ci-dessous).
- ✏️ Corriger le texte : liste des extraits, avec un champ titre et une zone de texte éditable pour corriger le contenu capturé directement (fautes de frappe, nettoyage de texte scrappé, etc.) — les modifications s'appliquent immédiatement à l'extrait (y compris dans le panneau latéral de la fenêtre principale) et l'aperçu se régénère automatiquement.
L'aperçu se régénère automatiquement (avec un léger délai anti-rebond) à chaque changement. Les réglages de style et les corrections de texte faits ici restent actifs pour l'export "normal" depuis le panneau latéral, même après avoir fermé cette fenêtre.
-
Sommaire cliquable : activable depuis l'onglet Style ("Inclure un sommaire", actif par défaut dès qu'il y a plus d'un extrait). Insère une page de sommaire juste après le titre du document, avec un lien cliquable vers chaque section — liens internes PDF standard (annotations
/Linkavec destination directe), utilisables dans n'importe quel lecteur PDF. -
Détection de liens de "suite" : les liens dont le texte — ou le texte d'un conteneur voisin proche (icône + légende, ex. "Partie Suivante" à côté du lien) — ressemble à suivant / next / chapitre suivant / lire la suite / part 2 etc. (ou une balise
<link rel="next">) sont surlignés en orange et listés dans le panneau, pour enchaîner facilement la lecture et la capture sans les chercher manuellement. La détection tourne en continu (MutationObserverJS, résultats poussés vers Python via le pont QWebChannel) plutôt qu'une seule fois au chargement — nécessaire car beaucoup de sites (SPA, pagination injectée après coup en JavaScript) ajoutent ce genre de lien bien après le signal de fin de chargement. -
Scraping assisté par IA locale (llama-cpp-python, aucune donnée envoyée en ligne) : configurez un modèle via "⚙️ Configurer l'IA locale" (fichier
.ggufde votre choix — non fourni avec l'appli, liens de téléchargement vérifiés dans la section Installation ci-dessous). Trois usages, combinables :- 🤖 Extraire (IA) : demande au modèle d'extraire le texte narratif principal de la page (menus/pubs/commentaires écartés) et l'ajoute au PDF — alternative à la sélection manuelle/au mode survol, utile sur les pages au contenu trop fragmenté pour un clic unique.
- 🤖 Lien suivant (IA) : demande au modèle de désigner, parmi tous les liens de la page, celui qui mène le plus probablement à la suite — complète la détection heuristique quand celle-ci ne trouve rien (structures de page trop inhabituelles pour un motif texte).
- 🔁 Scraping automatique (IA) : combine les deux en boucle — extrait, capture, trouve et suit le lien suivant, répète — jusqu'à un nombre de chapitres maximum fixé au démarrage (garde-fou demandé à chaque lancement) ou jusqu'à ce qu'aucune suite ne soit trouvée ; une détection de boucle (retour vers une page déjà visitée) arrête aussi le processus automatiquement. Bouton "⏹ Arrêter" disponible à tout moment. L'inférence tourne sur un thread dédié pour ne jamais geler l'interface.
Installation
python -m venv .venv
.venv\Scripts\activate # Windows
pip install -r requirements.txt
Lancement
python run.py
llama-cpp-python compile une extension native au moment de l'installation
(pas de wheel précompilé pour toutes les configurations) — l'installation
peut donc prendre plusieurs minutes selon la machine. Les fonctionnalités
IA restent optionnelles : sans modèle configuré, le reste de l'application
fonctionne normalement (les boutons IA affichent un message clair invitant
à configurer un modèle plutôt que d'échouer silencieusement).
IA locale (optionnel)
- Téléchargez un modèle au format GGUF (liens vérifiés ci-dessous — le fichier n'est pas fourni avec l'appli, à télécharger une seule fois).
- Dans PdfScrapper, ouvrez "⚙️ Configurer l'IA locale" et indiquez le
chemin du fichier
.gguf. - Les boutons "🤖 Extraire (IA)", "🤖 Lien suivant (IA)" et "🔁 Scraping automatique (IA)" sont alors utilisables.
Modèles GGUF recommandés
Existence, nom de fichier exact et taille vérifiés au moment de la rédaction. Prendre la variante Q4_K_M (bon compromis qualité/vitesse/ taille pour du CPU) sauf indication contraire — c'est le lien direct donné ci-dessous.
| Modèle | Taille (Q4_K_M) | Pourquoi celui-ci | Téléchargement |
|---|---|---|---|
| Qwen3-4B-Instruct-2507 (recommandé par défaut) | ~2,5 Go | Le plus récent de la liste, très bon suivi d'instructions (utile pour la sortie JSON du choix de lien) et bon en français, reste rapide sur CPU | lien direct · page du modèle |
| Qwen2.5-3B-Instruct (le plus léger) | ~1,9 Go | Le plus petit/rapide de la liste, correct en français, suffisant pour dépanner sur une machine modeste | lien direct · page du modèle |
| Mistral-7B-Instruct-v0.3 (meilleur français) | ~4,4 Go | Modèle Mistral AI (français), référence historique en qualité de français ; demande plus de RAM/CPU | lien direct · page du modèle |
| Llama-3.2-3B-Instruct (alternative légère) | ~2,0 Go | Généraliste léger, bonne alternative si Qwen ne convient pas | lien direct · page du modèle |
| Qwen2.5-7B-Instruct (meilleure qualité) | ~4,7 Go | Si ≥ 8 Go de RAM disponibles et qu'on veut la meilleure qualité d'extraction | lien direct · page du modèle |
Pour une machine avec peu de RAM, préférer les modèles 3-4B. Pour plus de qualité (et si le CPU/la RAM suit), les 7B donnent de meilleurs résultats sur l'extraction de contenu comme sur le choix du lien suivant.
Structure du projet
pdfscrapper/
main.py # point d'entrée (QApplication)
main_window.py # fenêtre principale : navigateur + panneau latéral
link_detector.py # heuristiques JS de détection des liens "suivant"
block_picker.py # heuristique JS de surlignage/capture de bloc au survol
bridge.py # pont QWebChannel (JS -> Python) pour la capture de bloc
clip_table.py # tableau des extraits (panneau latéral) : colonnes Heure/Titre/Aperçu/Lien
pdf_style.py # dataclass PdfStyle (réglages de mise en forme du PDF)
pdf_builder.py # génération du PDF (reportlab) : style, fond, sommaire/liens
preview_window.py # fenêtre d'aperçu en direct (QtPdf), style et correction du texte
ai_config.py # dataclass AiConfig, persistée via QSettings
ai_settings_dialog.py # fenêtre de configuration du modèle IA local (.gguf)
ai_worker.py # exécution des appels IA sur un thread dédié (non bloquant)
local_ai.py # inférence llama-cpp-python : extraction + choix du lien suivant
models.py # dataclass Clip (un extrait capturé) + regroupement en chapitres
run.py # lance l'application
Pistes d'évolution
- Sauvegarde/chargement d'une session de capture en cours (JSON).
- Réglage des motifs de détection de liens depuis l'interface.
- Export additionnel en
.txt/.epub.