Files
PdfScrapper/README.md
T
2026-08-12 11:02:03 +02:00

11 KiB
Raw Blame History

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 Ctrl enfoncé 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.

  • 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é.

  • 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 /Link avec 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 (MutationObserver JS, 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 .gguf de 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)

  1. 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).
  2. Dans PdfScrapper, ouvrez "⚙️ Configurer l'IA locale" et indiquez le chemin du fichier .gguf.
  3. 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
    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é)
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.