Une bibliothèque PDF à retirer
PdfNetStack est né chez un client. Son logiciel .NET dépendait d'une bibliothèque PDF tierce, et il voulait s'en séparer. Nous l'avons aidé à le faire, et c'est pendant ce travail que nous avons écrit PdfNetStack.
Retirer une bibliothèque PDF a l'air d'une petite tâche. Ça l'est rarement. Une bibliothèque PDF finit souvent par être appelée de partout dans une application, et il faut retrouver chaque appel avant de pouvoir décider ce qui le remplace.
Aujourd'hui, PdfNetStack est une bibliothèque PDF généraliste pour .NET. Elle est publiée sur NuGet sous licence MIT, et nous la maintenons pour toute la communauté .NET.
Partir de la spécification
Le format PDF est documenté. Ses spécifications sont publiées, et nous avons écrit PdfNetStack à partir d'elles. C'est un travail original, en C# entièrement managé.
Un choix a guidé tout le reste : aucun binaire natif. PdfNetStack n'appelle pas Ghostscript, ne lance pas de navigateur et n'embarque aucune bibliothèque native. Le module OCR est la seule exception : il exécute ses modèles avec ONNX Runtime.
Ce choix décide de l'endroit où le code peut tourner. La bibliothèque cible net8.0 et net10.0, sans aucune dépendance, et reste compatible avec le trimming et Native AOT. Elle tourne dans AWS Lambda, dans Azure Functions et dans un conteneur. Une cible netstandard2.0 couvre les applications plus anciennes : .NET Framework 4.6.2 à 4.8.1, Mono et Unity. La CI exécute les tests sur .NET Framework 4.8, .NET 8 et .NET 10, sous Windows, Linux et macOS.
Ce que fait PdfNetStack aujourd'hui
Le cœur de la bibliothèque couvre ce qu'un logiciel métier demande en général à un PDF :
- Compression sans perte : flux d'objets, tables de références croisées compressées, suppression des objets inaccessibles, recompression Flate, prédiction PNG, réencodage JPEG sans perte, déduplication. Le sous-échantillonnage des images et le JPEG avec perte sont optionnels, derrière un contrôle de qualité perceptuelle.
- Pages : fusion, découpage, réorganisation, rotation.
- Gros fichiers : ouverture à la demande avec une mémoire bornée, et enregistrements incrémentaux qui gardent les signatures valides.
- Sécurité : chiffrement AES-256 et AES-128, signatures PAdES de B-B à B-LTA, et leur validation.
- Contenu : dessin, images, annotations, polices OpenType, WOFF2 et variables, avec l'arabe et l'écriture de droite à gauche.
- Formulaires AcroForm : remplissage, aplatissement, création.
- Archivage et facturation : PDF/A-2 et PDF/A-3, factures Factur-X et ZUGFeRD.
- Extraction de texte et d'images.
Deux modules s'ajoutent si vous en avez besoin. PdfNetStack.Html convertit du HTML et du CSS en PDF sans navigateur, avec flex, grid, tableaux, médias paginés et polices web. PdfNetStack.Ocr rend les scans cherchables. Pour la ligne de commande, il y a PdfNetStack.Tool.
La preuve : chaque compression est vérifiée
Un fichier compressé qui ne dit plus la même chose est pire qu'un fichier lourd. Une facture à laquelle il manque un montant, ou un contrat dont une page s'affiche mal, ne se voit pas au moment de la compression. Quelqu'un le découvre plus tard.
PdfNetStack ne fait donc pas confiance à son propre optimiseur. Après une passe, il relit le fichier qu'il vient d'écrire et le compare à la source, objet par objet. Les flux sont décodés avant la comparaison. Les images JPEG sont comparées coefficient DCT par coefficient DCT. Si quoi que ce soit diffère, vous récupérez vos octets d'origine.
Les fichiers signés ou chiffrés suivent une règle plus simple : l'optimiseur ne les réécrit jamais. Une signature couvre des octets précis, et réécrire le fichier la casserait.
Le mode sans perte est le mode par défaut. Les options avec perte existent, mais il faut les demander, et elles passent par un contrôle de qualité perceptuelle.
Les chiffres
Nous publions un benchmark que n'importe qui peut reproduire. À chaque version, la CI télécharge 77 PDF sous licence libre ou dans le domaine public : documents du NIST et de la NASA, articles arXiv, journaux officiels, fichiers de test.
Résultats de la version 1.1.0, le 5 novembre 2026, sur une machine Linux à 4 cœurs :
- mode sans perte par défaut : de 196,6 Mio à 172,9 Mio, soit 12,1 % de gain
- préréglage équilibré : 23,4 % de gain
- profil avec perte : 29,5 % de gain
- aucun échec, et les pages vérifiées de chaque sortie sans perte s'affichent à l'identique dans PDFium
Avec la version 1.0.0, nous avons aussi passé un corpus privé de 1 296 fichiers réels : 569 Mio de factures, rapports, manuels, scans et présentations. 1 003 fichiers en sont sortis optimisés, pour 17,6 % de gain. Zéro échec de vérification et zéro pixel différent à 150 DPI sur 2 161 pages, en 65 secondes environ sur 8 cœurs.
Le corpus privé n'est pas publié. Le benchmark public est celui sur lequel s'appuyer : il se relance, et chaque version le repasse.
Et les SDK commerciaux ?
Apryse, anciennement PDFTron, vend un SDK PDF commercial, et d'autres éditeurs font de même. PdfNetStack n'a aucun lien avec PDFNet, le SDK d'Apryse, malgré la proximité des noms.
Nous n'avons pas mesuré PdfNetStack face à ces SDK, donc nous ne publions aucune comparaison chiffrée. Sur certains travaux précis, nous pensons pourtant qu'il fait mieux, et chaque raison se vérifie sur PdfNetStack lui-même :
- la licence MIT, sans clé de licence ni redevance par déploiement
- du C# entièrement managé, sans binaire natif
- chaque fichier compressé est prouvé équivalent à sa source, et l'original revient si quoi que ce soit diffère
- les fichiers signés ou chiffrés ne sont jamais réécrits par l'optimiseur
- il tourne dans AWS Lambda, Azure Functions et les conteneurs, avec le trimming et Native AOT
Pour votre cas, le meilleur comparatif reste vos propres fichiers. La bibliothèque s'installe en une commande.
Pourquoi l'open source, et pourquoi MIT
Nous aurions pu garder ce code pour nos missions. Nous l'avons publié parce qu'une bibliothèque PDF progresse avec les fichiers qu'on lui donne, et d'autres équipes lui en donneront que nous n'aurions jamais vus.
La licence MIT est courte et permissive : usage commercial compris, sans clé de licence ni redevance par déploiement. Personne n'a besoin de nous écrire avant de l'utiliser. Notre métier est de concevoir et de faire évoluer des logiciels pour nos clients, et une bibliothèque utilisée par d'autres équipes nous apprend davantage qu'une licence vendue.
La version 1.0.0 est sortie sur NuGet le 28 octobre 2026, la 1.1.0 le 5 novembre. Le 12 novembre, NuGet comptait 1 519 téléchargements sur les six paquets, dont 1 010 pour PdfNetStack. Ces chiffres incluent des téléchargements automatisés : ils ne disent pas combien d'équipes l'utilisent.
Démarrer
Ajoutez le paquet à votre projet :
dotnet add package PdfNetStackPour compresser des fichiers sans écrire de code, installez l'outil en ligne de commande :
dotnet tool install -g PdfNetStack.Tool
pdfnetstack optimize in.pdf out.pdfLa documentation est sur jadev-corp.com/pdfnetstack, le code source sur GitHub et les paquets sur NuGet.
La suite
Le site de documentation ouvre avec cet article. Chaque nouvelle version repasse le benchmark public dans la CI. Si un fichier se comporte mal, le dépôt GitHub est l'endroit où nous le signaler.
Et si votre application .NET dépend d'un SDK PDF dont vous voulez sortir, c'est un chantier que nous savons mener. Il fait partie de notre offre de modernisation de logiciel métier. Le projet lui-même est décrit sur sa page de référence.

