Réduire la taille d’un fichier PDF : images, polices et flux de contenu en JavaScript (React)

2026-09-18 08:27:36 Allen Yang
AI Summarize:
ChatGPT
ChatGPT ✓
Claude ✓
Grok ✓
Perplexity ✓
Quick
Quick
Concise overview
Highlights
Key takeaways
Detailed
Structured explanation
Brief
One sentence summary
Summarize |

Compressing the images, fonts and content streams of a PDF in the browser with Spire.PDF for JavaScript

Un PDF est rarement simplement « trop volumineux ». Il est trop volumineux pour une porte précise — une limite de pièce jointe, un formulaire d'envoi, un quota de stockage — et ce qui l'a poussé au-delà de cette limite relève généralement de l'une de trois causes. Compresser sans savoir laquelle revient à deviner, et deviner coûte soit de la qualité, soit un nouvel échec d'envoi.

Spire.PDF for JavaScript vous fournit un compresseur avec une option pour chacun de ces trois endroits. Elles peuvent être appliquées séparément ou ensemble, et les compromis sont suffisamment différents pour qu'il vaille la peine de comprendre chacune avant de décider. Tout s'exécute dans le navigateur via WebAssembly, les fichiers circulant dans un système de fichiers virtuel (VFS), de sorte qu'un document n'a pas besoin d'être téléversé vers un service tiers pour être réduit.

Pour la configuration du projet, consultez Intégrer Spire.PDF for JavaScript dans un projet React. Les exemples ci-dessous supposent que le paquet est installé et que le module WebAssembly a été initialisé.


Ce qui rend réellement un PDF volumineux

La taille d'un fichier PDF provient de trois endroits différents, et ils se comportent de manière totalement dissemblable :

Où se situe le poids À quoi cela ressemble Un indice que c'est la cause
Images Des images bitmap incorporées à leur propre résolution — numérisations, photos, captures d'écran exportées Peu de pages, des dizaines de mégaoctets
Polices incorporées Des programmes de police stockés dans le fichier pour que le texte s'affiche à l'identique partout Surtout du texte, et pourtant plusieurs mégaoctets
Flux de contenu Les instructions de dessin derrière le texte et les graphiques vectoriels Le fichier a été modifié ou réenregistré par plusieurs outils différents

Deux documents de même longueur peuvent différer d'un ordre de grandeur pour cette raison : un contrat numérisé de cinq pages peut peser 20 Mo tandis qu'un rapport textuel de cinquante pages reste sous 1 Mo. C'est pourquoi « combien puis-je compresser ceci ? » n'a pas de réponse unique — un fichier riche en numérisations a beaucoup à rendre, et un document déjà composé principalement de texte et d'art vectoriel est proche de son plancher.

Le diagnostic vient donc en premier. Compresser un document essentiellement textuel avec des paramètres d'image ne fait presque rien, et écraser les images d'un document dont le poids réside en réalité dans ses polices sacrifie de la qualité sans aucun gain.


Les trois leviers de compression

PdfCompressor expose sa stratégie via Options, et chaque groupe de paramètres correspond à l'une des trois sources ci-dessus :

Option Ce qu'elle cible Ce à quoi vous renoncez
ImageCompressionOptions Les images bitmap de la page La fidélité des images — c'est le seul levier avec perte parmi les trois
TextCompressionOptions Les données de police incorporées Rien, sauf si vous désincorporez les polices, auquel cas la portabilité
CompressContents Les flux de contenu des pages Pratiquement rien — le contenu est réencodé, non supprimé

Les trois sections suivantes les abordent une par une afin que l'effet de chacune soit visible isolément. La section qui suit les combine, ce que vous voudrez généralement en production.


Compresser les images

Les images bitmap à haute résolution sont la cause unique la plus fréquente d'un PDF surdimensionné, et c'est aussi là que les gains sont les plus importants. Options.ImageCompressionOptions contrôle la mise à l'échelle et le réencodage via trois propriétés :

Propriété Ce qu'elle fait Quand il vaut la peine de la définir
ResizeImages Réduit les images proportionnellement, puis les réencode Photos ou numérisations capturées bien au-dessus de la résolution à laquelle elles sont affichées
CompressImage Applique un réencodage avec perte aux images Chaque fois que la qualité d'image a une marge de manœuvre
ImageQuality Sélectionne le niveau de qualité pour ce réencodage Le réglage final — High conserve plus de détails, Low produit un fichier plus petit
// Compress images in the document: resize, re-compress, and lower the quality
compressor.Options.ImageCompressionOptions.ResizeImages = true;
compressor.Options.ImageCompressionOptions.CompressImage = true;
compressor.Options.ImageCompressionOptions.ImageQuality = pdfModule.ImageQuality.Low;

ImageQuality ne fait rien à elle seule — elle décrit seulement comment sont encodées les images passant par les deux premières propriétés, donc la définir seule vous rend le même fichier. Et comme c'est le seul levier avec perte, testez d'abord au niveau High si le PDF doit être imprimé plutôt que lu à l'écran.


Polices : compresser ou désincorporer

Pour que le texte s'affiche à l'identique sur des machines qui ne possèdent pas les polices d'origine, un PDF transporte dans le fichier les programmes de police utilisés dans son texte. Ils peuvent être sous-ensembles, mais ils ne sont jamais absents — et plusieurs familles à plusieurs graisses finissent par peser. Options.TextCompressionOptions offre deux manières très différentes de gérer cela :

Propriété Ce qu'elle fait Le piège
CompressFonts Compresse les données de police incorporées et laisse les polices en place Aucun pour le rendu — les glyphes restent dans le fichier
UnembedFonts Supprime les programmes de police et laisse le lecteur substituer des polices système Substitution de glyphes ou décalages d'espacement partout où ces polices sont absentes
// Compress font data; UnembedFonts goes further and removes the embedded fonts
compressor.Options.TextCompressionOptions.CompressFonts = true;
compressor.Options.TextCompressionOptions.UnembedFonts = true;

La combinaison ci-dessus est la plus agressive, et elle n'est sûre qu'à une seule condition : que vous sachiez ce qui affichera le document. Un lien de téléchargement ou un e-mail à un destinataire inconnu ne remplit pas cette condition — dans ce cas, gardez les polices incorporées et laissez CompressFonts faire le travail. Ne désincorporez que là où l'ensemble de polices est fixe, comme une visionneuse interne à configuration connue.


Recompresser les flux de contenu

Le texte et les commandes de dessin vectoriel d'une page résident dans des flux de contenu. Ils sont compressés lorsque le PDF est écrit, mais un document qui a été modifié à plusieurs reprises, ou qui est passé entre différents outils, peut y accumuler de la redondance. Options.CompressContents réencode ces flux :

// Re-compress the document content streams
compressor.Options.CompressContents = true;

Pris isolément, c'est le moins spectaculaire des trois — ne comptez pas sur lui pour sauver un document riche en photos. Il gagne sa place dans les documents denses en texte à mise en page complexe, et c'est le levier le plus sûr à laisser activé, puisque réencoder un flux ne change pas ce qu'il dessine.


Les trois en une seule passe

Les trois dimensions ne correspondent pas à trois exécutions distinctes. Vous pointez un seul PdfCompressor vers un fichier, définissez autant d'options que nécessaire, et écrivez le résultat une seule fois avec CompressToFile.

L'exemple ci-dessous active le redimensionnement et la recompression des images au niveau High, la compression des polices avec désincorporation, et la recompression des flux de contenu — sur un document qui contient à la fois des images haute résolution et du corps de texte :

function App() {
  const compressPdfDocument = async () => {
    // Get the Spire.PDF WASM module
    const pdfModule = window.wasmModule?.spirepdf;

    // Check that the module is ready
    if (!pdfModule) {
      alert('Spire.PDF is not ready yet');
      return;
    }

    // Load the PDF to be compressed into the VFS
    const inputFileName = 'ImageDocument.pdf';
    await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);

    // Create a PdfCompressor and point it at the PDF to compress
    let compressor = new pdfModule.PdfCompressor({ filePath: inputFileName });

    // 1. Image compression: resize and re-compress images, with a higher quality tier
    compressor.Options.ImageCompressionOptions.ResizeImages = true;
    compressor.Options.ImageCompressionOptions.CompressImage = true;
    compressor.Options.ImageCompressionOptions.ImageQuality = pdfModule.ImageQuality.High;

    // 2. Font compression: compress font data and remove embedded fonts
    compressor.Options.TextCompressionOptions.CompressFonts = true;
    compressor.Options.TextCompressionOptions.UnembedFonts = true;

    // 3. Content compression: re-compress the document content streams
    compressor.Options.CompressContents = true;

    // Define the output file name and compress to it
    const outputFileName = 'CompressedDocument.pdf';
    compressor.CompressToFile(outputFileName);

    // Read the generated file from the VFS and trigger the download
    const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
    const blob = new Blob([fileArray], { type: 'application/pdf' });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = outputFileName;
    a.click();
    URL.revokeObjectURL(url);
  };

  return (
    <div style={{ textAlign: 'center', height: '300px' }}>
      <h1>Compress PDF Document</h1>
      <button onClick={compressPdfDocument}>
        Generate
      </button>
    </div>
  );
}

export default App;

Document PDF compressé en combinant les trois approches

PDF document compressed by combining all three approaches

Deux remarques sur la forme de ce code. L'original reste intact dans le VFS — CompressToFile écrit un nouveau document, ce qui laisse le choix entre avant et après. Et comme le compresseur agit sur les ressources du document plutôt que sur des pages rendues, le texte reste du vrai texte : toujours sélectionnable, toujours recherchable. Seules les images sont réencodées.


Vérifier ce qui a changé

Les deux fichiers se trouvent dans le VFS, vous pouvez donc les comparer avant de remettre le résultat à l'utilisateur plutôt que de deviner si les paramètres ont produit un effet :

// Both the original and the compressed copy are in the VFS
const originalBytes = window.dotnetRuntime.Module.FS.readFile(inputFileName).length;
const compressedBytes = window.dotnetRuntime.Module.FS.readFile(outputFileName).length;

Indiquez la différence en pourcentage à côté du téléchargement plutôt que de proposer un simple bouton — cela dit immédiatement à l'utilisateur si le fichier est désormais assez petit pour sa destination. Si les deux nombres sont presque identiques, le poids ne se trouvait pas là où vous compressiez.


Adapter les paramètres au document

Le document À activer À surveiller
Pages numérisées, photos, captures d'écran ResizeImages, CompressImage, ImageQuality réglé pour l'écran ou l'impression Les détails fins dans une numérisation s'adoucissent en premier — vérifiez en High avant de livrer
Surtout du texte et de l'art vectoriel CompressFonts, CompressContents Les gains sont modestes par nature ; ne les poursuivez pas avec des paramètres d'image
Contenu mixte Les trois, en ImageQuality.High Le profil généraliste le plus sûr, et généralement le meilleur point de départ
Déjà optimisé pour la diffusion CompressContents uniquement Peu à gagner ; un réencodage agressif des images peut coûter de la qualité pour presque rien

Problèmes courants

Le fichier a à peine diminué, et le PDF ne contient presque aucune image. La taille provient des polices ou des flux de contenu. Activez TextCompressionOptions — avec UnembedFonts uniquement si l'environnement de visualisation est connu — et ajoutez CompressContents. Les documents denses en texte réagissent à ces deux-là et à rien d'autre.

Le texte s'affiche différemment après la compression. C'est UnembedFonts qui fait exactement ce qu'il annonce. Remettez-le à false et gardez CompressFonts = true ; les données de police restent compressées, mais les glyphes demeurent dans le fichier.

Les images paraissent floues ou pixelisées dans le résultat. Soit le niveau ImageQuality est trop bas, soit ResizeImages a réduit une image qui avait besoin de sa résolution pour l'impression. Pour tout ce qui sera imprimé, commencez à High.

Le fichier compressé a la même taille que l'original. Certains documents sont déjà optimisés et n'ont plus rien d'utile à rendre. Vérifiez avec la comparaison d'octets ci-dessus plutôt que de supposer que les paramètres ont échoué.

Rien ne se passe au premier clic. Le module WebAssembly se charge de manière asynchrone. C'est à cela que sert la garde if (!pdfModule) return; — dans une véritable application, désactivez le bouton jusqu'à ce que le module signale qu'il est prêt au lieu d'afficher une alerte.


FAQ

Vers quel levier dois-je me tourner en premier ?

Les images, en supposant qu'elles soient le coupable — mais confirmez-le. Si le document est riche en texte et disproportionné par rapport à son nombre de pages, commencez par les polices et les flux de contenu et laissez les paramètres d'image de côté.

Compresser un PDF rend-il son texte illisible ou non sélectionnable ?

Non, et c'est là qu'un compresseur basé sur une API diffère des outils en ligne qui transforment chaque page en JPEG. Le texte reste du texte, l'art vectoriel reste vectoriel, et seules les images bitmap sont touchées — la copie compressée reste donc sélectionnable, recherchable et imprimable.

Puis-je compresser seulement une partie d'un document ?

Le compresseur agit sur le document dans son ensemble. Si vous avez besoin de réduire une partie d'un fichier et d'en laisser une autre intacte, fractionnez d'abord le document, compressez la partie qui en a besoin, puis fusionnez à nouveau.

Puis-je conserver l'original et proposer la copie compressée comme choix ?

Oui. CompressToFile écrit vers un nouveau nom de fichier et laisse l'entrée dans le VFS, les deux versions sont donc disponibles dans la même session — utile lorsque l'utilisateur décide de la quantité de qualité à échanger.

Cela nécessite-t-il un serveur, ou est-ce entièrement exécutable dans le navigateur ?

Entièrement. Le moteur PDF est compilé en WebAssembly et les fichiers circulent dans le VFS, le document ne quitte donc jamais l'appareil. Cela importe surtout pour précisément les documents que les gens veulent habituellement réduire — contrats, relevés, dossiers.


Voir aussi