Un guide simple pour utiliser BentoPDF directement dans votre navigateur, entièrement en local et sans installation de serveur permanent.
Ce guide vous permet d'utiliser BentoPDF, une suite d'outils PDF complète, directement dans votre navigateur sans jamais envoyer vos fichiers sur internet. Tout le traitement se fait localement sur votre machine.
Avantages :
- ✅ 100% privé - vos fichiers ne quittent jamais votre ordinateur
- ✅ Pas d'inscription requise
- ✅ Pas d'hébergement permanent
- ✅ La plupart des outils fonctionnent (fusion, découpe, compression, signature, OCR, etc.)
- Un ordinateur (Windows, macOS ou Linux)
- Une connexion internet (uniquement pour le téléchargement initial)
- Un navigateur web moderne (Chrome, Firefox, Edge, Safari)
- Rendez-vous sur le site officiel de Python : https://www.python.org/downloads/
- Téléchargez la dernière version stable (bouton "Download Python 3.x.x")
- Lancez l'installateur
⚠️ IMPORTANT : Cochez la case "Add Python to PATH" avant de cliquer sur "Install Now"- Suivez les instructions d'installation par défaut
Pour vérifier que Python est bien installé, ouvrez un terminal (PowerShell ou CMD sur Windows, Terminal sur macOS/Linux) et tapez :
python --versionVous devriez voir s'afficher quelque chose comme Python 3.12.0.
-
Rendez-vous sur la page des releases de BentoPDF : https://github.com/alam00000/bentopdf/releases
-
Cherchez la dernière version stable (la plus récente en haut de la liste)
-
Dans la section "Assets", téléchargez le fichier qui commence par
distet se termine par.zipExemple :
dist-2.8.7.zip
- Créez un dossier où vous voulez installer BentoPDF (par exemple
C:\BentoPDFou~/BentoPDF) - Extrayez le contenu du fichier
.ziptéléchargé dans ce dossier - Supprimez le fichier
.zip(vous n'en avez plus besoin) - Dans ce même dossier, créez un nouveau fichier texte
- Copiez le code Python suivant et collez-le dans ce fichier :
import http.server
import socketserver
import mimetypes
import os
import sys
# Types MIME personnalisés
mimetypes.add_type("application/javascript", ".js")
mimetypes.add_type("application/javascript", ".mjs")
mimetypes.add_type("application/wasm", ".wasm")
mimetypes.add_type("font/woff2", ".woff2")
mimetypes.add_type("text/html", ".html")
mimetypes.add_type("application/octet-stream", ".data")
# Essayer d'importer brotli (facultatif, pour les fichiers .br)
try:
import brotli
HAS_BROTLI = True
except ImportError:
HAS_BROTLI = False
class BentoHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
path = self.translate_path(self.path)
# 1) Fichier .br : le décompresser à la volée
if HAS_BROTLI and os.path.exists(path + ".br"):
self.send_response(200)
mime, _ = mimetypes.guess_type(path)
self.send_header("Content-Type", mime or "application/octet-stream")
self.send_header("Cross-Origin-Opener-Policy", "same-origin")
self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
self.send_header("Cross-Origin-Resource-Policy", "same-origin")
self.send_header("Cache-Control", "no-cache")
self.end_headers()
with open(path + ".br", "rb") as f:
self.wfile.write(brotli.decompress(f.read()))
return
# 2) Fichier .gz : servir avec Content-Encoding pour décompression auto
if os.path.exists(path + ".gz") and not os.path.exists(path):
self.send_response(200)
mime, _ = mimetypes.guess_type(path)
self.send_header("Content-Type", mime or "application/octet-stream")
self.send_header("Content-Encoding", "gzip")
self.send_header("Cross-Origin-Opener-Policy", "same-origin")
self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
self.send_header("Cross-Origin-Resource-Policy", "same-origin")
self.send_header("Cache-Control", "no-cache")
self.end_headers()
with open(path + ".gz", "rb") as f:
self.wfile.write(f.read())
return
# 3) Fichier normal : on ajoute juste les en-têtes de sécurité
super().do_GET()
def end_headers(self):
# Appliqués à TOUTE requête
self.send_header("Cross-Origin-Opener-Policy", "same-origin")
self.send_header("Cross-Origin-Embedder-Policy", "require-corp")
self.send_header("Cross-Origin-Resource-Policy", "same-origin")
super().end_headers()
socketserver.TCPServer.allow_reuse_address = True
try:
with socketserver.TCPServer(("127.0.0.1", 8000), BentoHandler) as httpd:
print("\n" + "=" * 60)
print(" BentoPDF Local Server")
print("=" * 60)
print(f" Brotli support: {'enabled' if HAS_BROTLI else 'disabled (pip install brotli)'}")
print(" URL : http://localhost:8000")
print(" Ctrl+C : pour arrêter")
print("=" * 60 + "\n")
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServeur arrêté.")- Enregistrez ce fichier avec l'extension
.py(par exempleserveur-bentopdf.py)
-
Lancez le script Python que vous venez de créer :
python serveur-bentopdf.py
-
Vous devriez voir s'afficher :
============================================================ BentoPDF Local Server ============================================================ Brotli support: disabled (pip install brotli) URL : http://localhost:8000 Ctrl+C : pour arrêter ============================================================
- Ouvrez votre navigateur web
- Dans la barre d'adresse, tapez :
http://localhost:8000 - Appuyez sur Entrée
- BentoPDF est maintenant accessible localement !
Une fois sur http://localhost:8000, vous avez accès à l'interface complète de BentoPDF avec tous les outils disponibles :
- Fusionner plusieurs PDF
- Découper un PDF en plusieurs parties
- Compresser pour réduire la taille
- Signer électroniquement
- Convertir des images en PDF
- OCR (reconnaissance de texte)
- Et bien plus encore...
Tous les fichiers que vous traitez restent sur votre ordinateur et ne sont jamais envoyés sur internet.
Avec cette méthode d'installation simple, la plupart des outils fonctionnent parfaitement, mais certains outils avancés peuvent ne pas fonctionner :
- ❌ Word/Excel/PowerPoint → PDF : Ces conversions nécessitent LibreOffice en WebAssembly qui requiert une configuration serveur plus complexe
- ❌ Certains formats de conversion Office : ODT, RTF, etc.
Pour une installation complète avec TOUS les outils fonctionnels, vous devrez utiliser Docker (voir la documentation officielle).
Pour arrêter le serveur local :
- Retournez dans le terminal où le script Python est en cours d'exécution
- Appuyez sur Ctrl+C
- Le serveur s'arrête immédiatement
Vous pouvez redémarrer le serveur à tout moment en relançant le script Python (étape 4).
Si vous voulez activer le support Brotli pour de meilleures performances :
- Ouvrez un terminal
- Tapez :
pip install brotli
- Relancez le serveur
Le navigateur affiche une page blanche :
- Vérifiez que le serveur Python est bien lancé dans le terminal
- Vérifiez que vous accédez bien à
http://localhost:8000
Erreur "Port 8000 already in use" :
- Un autre programme utilise déjà ce port
- Modifiez le numéro de port dans le script Python (ligne
socketserver.TCPServer(("127.0.0.1", 8000), BentoHandler)) par un autre numéro comme 8080 ou 9000
Un outil ne fonctionne pas :
- Consultez la section Limitations pour voir si cet outil nécessite Docker
BentoPDF est distribué sous double licence AGPL-3.0 et licence commerciale. Consultez le dépôt officiel pour plus d'informations.
Crédits : Ce guide est basé sur le projet BentoPDF par alam00000.