Bhinish Dhiman
Pourquoi fusionner un PDF chiffré peut donner des pages blanches, mesures à l'appui
Traduit de l’original en anglais. Lire l’original
La fusion d'un PDF protégé par mot de passe avec la version d'origine de pdf-lib et l'option ignoreEncryption a produit un fichier de quatre pages dont les trois pages protégées étaient blanches, et seuls 49 caractères sur 373 ont survécu, parce que le contenu des pages a été copié encore chiffré. La même fusion avec @cantoo/pdf-lib et le mot de passe a donné quatre pages, 373 caractères et aucune page blanche.
Le symptôme est bien connu : vous fusionnez un relevé bancaire avec une lettre d’accompagnement, aucune erreur ne s’affiche, et les pages du relevé ressortent blanches. Nous l’avons reproduit dans du code et avons compté ce qui était perdu.
Ce que le chiffrement PDF chiffre réellement
Le chiffrement PDF applique un algorithme de chiffrement (AES-256 selon la norme ISO 32000-2) aux chaînes et aux flux du fichier, et uniquement à eux. La structure des objets reste en clair : un lecteur peut voir, sans mot de passe, qu’il y a trois pages, quelle est leur taille et quel flux de contenu chacune utilise. Ce qu’il ne peut pas faire sans le mot de passe, c’est transformer ces flux de contenu chiffrés en instructions de dessin.
Cette séparation est tout le mécanisme de la page blanche. Une bibliothèque peut parcourir la structure, copier les pages et ne jamais remarquer que les octets copiés sont toujours chiffrés.
La mesure
Nous avons construit un relevé de trois pages contenant 324 caractères de texte connu et l’avons chiffré en AES-256 avec un mot de passe utilisateur, au moyen du même appel encrypt() que notre outil Protect PDF. Nous l’avons ensuite fusionné à la suite d’une lettre d’accompagnement d’une page et de 49 caractères, par deux voies : pdf-lib 1.17.1 d’origine, chargé avec ignoreEncryption: true, et @cantoo/pdf-lib 2.11.1, chargé avec le mot de passe, ce que fait src/lib/pdf/ops.ts. Chaque résultat a été ouvert dans pdf.js 6.3.289, son texte extrait, et chaque page rendue à demi-échelle puis analysée à la recherche du moindre pixel non blanc. Exécuté sous Node 24 le 1er octobre 2026.
| Voie | Pages en sortie | Caractères extraits | Pages blanches | Dictionnaire Encrypt dans la sortie |
|---|---|---|---|---|
pdf-lib d’origine, ignoreEncryption: true |
4 | 49 | 3 | Non |
| @cantoo/pdf-lib, mot de passe fourni | 4 | 373 | 0 | Non |
Les deux voies signalent un succès. Les deux produisent un fichier qui s’ouvre sans mot de passe. L’une d’elles a jeté le relevé.
Pourquoi les pages sont blanches plutôt que brouillées
Par défaut, la version d’origine de pdf-lib refuse un fichier chiffré, avec un message qui indique la porte de sortie : “Input document to PDFDocument.load is encrypted. You can use PDFDocument.load(..., { ignoreEncryption: true }).” Les outils qui veulent avoir l’air de gérer les fichiers chiffrés empruntent cette porte.
Avec cette option, la bibliothèque analyse la structure qu’elle peut lire et copie trois objets page, chacun pointant vers un flux de contenu chiffré en AES. Le nouveau document n’a pas de dictionnaire de chiffrement : un lecteur traite donc ces flux comme de simples données compressées en Flate, les décompresse, obtient du bruit et cesse de dessiner. pdf.js consigne Trying to parse invalid object et Invalid object ref: 14 0 R, puis passe à la suite. Les 49 caractères qui ont survécu sont ceux de la lettre d’accompagnement, qui n’a jamais été chiffrée.
La variante sur place est pire
Nous avons aussi chargé le fichier chiffré avec ignoreEncryption, modifié un champ de métadonnées et enregistré sans rien copier. Ce fichier n’a pas pu être ouvert du tout : pdf.js a répondu Incorrect Password alors qu’on lui donnait le bon mot de passe. L’enregistrement avait réécrit la structure du fichier autour de données chiffrées dont les clés ne correspondaient plus : un document que personne ne peut récupérer, et non un document avec une page blanche.
C’est le fork qui déchiffre
@cantoo/pdf-lib est un fork de pdf-lib qui ajoute une option password à load() et une méthode encrypt(). Avec le mot de passe, il déchiffre chaque flux pendant l’analyse : copyPages déplace donc du contenu en clair, et le fichier fusionné contient les 373 caractères, avec un rendu correct de chaque page. Sans le mot de passe, il lève une erreur exactement comme la version d’origine : il ne devine pas, et aucune voie ne permet de retirer un mot de passe que vous ne connaissez pas.
Le test à faire sur n’importe quel outil de fusion
Fusionnez un fichier protégé puis extrayez-en le texte, avec notre outil PDF to text ou n’importe quel autre. Si les caractères du document protégé sont absents, l’outil a copié des données chiffrées. Une page blanche n’est pas un défaut d’affichage qu’une autre visionneuse corrigerait ; le contenu n’a pas survécu à la fusion.