
Un PDF raramente è semplicemente "troppo grande". È troppo grande per uno specifico varco — un limite per gli allegati email, un modulo di caricamento, una quota di archiviazione — e qualunque cosa lo abbia spinto oltre quel limite è di solito una di tre cose. Comprimere senza sapere quale delle tre significa tirare a indovinare, e indovinare costa o in termini di qualità o con un altro caricamento fallito.
Spire.PDF for JavaScript ti offre un compressore con un'opzione per ciascuno di quei tre punti. Possono essere applicate separatamente o insieme, e i compromessi sono abbastanza diversi da rendere utile comprenderli ciascuno prima di decidere. Tutto viene eseguito nel browser su WebAssembly, con i file che passano attraverso un file system virtuale (VFS), così un documento non deve essere caricato su un servizio di terze parti per essere ridotto.
Per la configurazione del progetto, vedi Integrare Spire.PDF for JavaScript in un progetto React. Gli esempi seguenti presuppongono che il pacchetto sia installato e che il modulo WebAssembly sia stato inizializzato.
Cosa rende davvero grande un PDF
La dimensione di un file PDF proviene da tre punti diversi, e si comportano in modo del tutto diverso:
| Dove risiede il peso | Come si presenta | Un indizio che è la causa |
|---|---|---|
| Immagini | Bitmap incorporati alla loro risoluzione — scansioni, foto, screenshot esportati | Poche pagine, decine di megabyte |
| Font incorporati | Programmi di font memorizzati all'interno del file affinché il testo venga visualizzato in modo identico ovunque | Prevalentemente testo, eppure diversi megabyte |
| Flussi di contenuto | Le istruzioni di disegno dietro il testo e la grafica vettoriale | Il file è stato modificato o risalvato da diversi strumenti differenti |
Due documenti della stessa lunghezza possono differire di un ordine di grandezza per questo motivo: un contratto scansionato di cinque pagine può pesare 20 MB mentre un report testuale di cinquanta pagine resta sotto 1 MB. Ecco perché "quanto posso comprimere questo file?" non ha un'unica risposta — un file ricco di scansioni ha molto da restituire, e un documento già composto per lo più da testo e grafica vettoriale è vicino al suo limite minimo.
Quindi la diagnosi viene prima. Comprimere un documento ricco di testo con le impostazioni per le immagini non fa quasi nulla, e schiacciare le immagini in un documento il cui peso è in realtà nei font spreca qualità senza alcun guadagno.
Le tre leve di compressione
PdfCompressor espone la sua strategia tramite Options, e ogni gruppo di impostazioni corrisponde a una delle tre fonti sopra:
| Opzione | Su cosa agisce | A cosa rinunci |
|---|---|---|
ImageCompressionOptions |
I bitmap sulla pagina | La fedeltà delle immagini — è l'unica leva con perdita delle tre |
TextCompressionOptions |
I dati dei font incorporati | Nulla, a meno che tu non rimuova i font incorporati, nel qual caso la portabilità |
CompressContents |
I flussi di contenuto delle pagine | Praticamente nulla — il contenuto viene ricodificato, non scartato |
Le tre sezioni successive le affrontano una alla volta, così che l'effetto di ciascuna sia visibile singolarmente. La sezione seguente le combina, ed è ciò che di solito vorrai in produzione.
Comprimere le immagini
I bitmap ad alta risoluzione sono la causa singola più comune di un PDF sovradimensionato, e sono anche il punto in cui si ottengono i guadagni maggiori. Options.ImageCompressionOptions controlla il ridimensionamento e la ricodifica tramite tre proprietà:
| Proprietà | Cosa fa | Quando vale la pena impostarla |
|---|---|---|
ResizeImages |
Ridimensiona le immagini proporzionalmente, poi le ricodifica | Foto o scansioni acquisite a una risoluzione molto superiore a quella con cui vengono visualizzate |
CompressImage |
Applica una ricodifica con perdita alle immagini | Ogni volta che la qualità delle immagini ha margine di riduzione |
ImageQuality |
Seleziona il livello di qualità per quella ricodifica | La manopola finale — High mantiene più dettaglio, Low produce un file più piccolo |
// Comprimi le immagini nel documento: ridimensiona, ricomprimi e abbassa la qualità
compressor.Options.ImageCompressionOptions.ResizeImages = true;
compressor.Options.ImageCompressionOptions.CompressImage = true;
compressor.Options.ImageCompressionOptions.ImageQuality = pdfModule.ImageQuality.Low;
ImageQuality non fa nulla da sola — descrive solo come vengono codificate le immagini che passano attraverso le prime due proprietà, quindi impostarla da sola ti restituisce lo stesso file. E poiché questa è l'unica leva con perdita, prova prima al livello High se il PDF verrà stampato anziché letto a schermo.
Font: comprimere o rimuovere l'incorporamento
Per far sì che il testo venga visualizzato in modo identico su macchine che non dispongono dei caratteri originali, un PDF porta all'interno del file i programmi di font usati nel suo testo. Possono essere sottoinsiemi, ma non sono assenti — e diverse famiglie con diversi pesi si sommano. Options.TextCompressionOptions offre due modi molto diversi per gestire la cosa:
| Proprietà | Cosa fa | Il rovescio della medaglia |
|---|---|---|
CompressFonts |
Comprime i dati dei font incorporati e lascia i font al loro posto | Nessuno per la resa — i glifi restano nel file |
UnembedFonts |
Rimuove i programmi di font e lascia che il lettore sostituisca i font di sistema | Sostituzione dei glifi o variazioni di spaziatura ovunque quei font siano assenti |
// Comprimi i dati dei font; UnembedFonts va oltre e rimuove i font incorporati
compressor.Options.TextCompressionOptions.CompressFonts = true;
compressor.Options.TextCompressionOptions.UnembedFonts = true;
La combinazione sopra è quella aggressiva, ed è sicura a una sola condizione: che tu sappia cosa renderizzerà il documento. Un link per il download o un'email a un destinatario sconosciuto non è quella condizione — in quel caso, mantieni i font incorporati e lascia che CompressFonts faccia il lavoro. Rimuovi l'incorporamento solo dove il set di font è fisso, come in un visualizzatore interno con una configurazione nota.
Ricomprimere i flussi di contenuto
Il testo e i comandi di disegno vettoriale su una pagina risiedono nei flussi di contenuto. Vengono compressi quando il PDF viene scritto, ma un documento modificato ripetutamente, o passato tra strumenti diversi, può accumulare ridondanza al loro interno. Options.CompressContents ricodifica quei flussi:
// Ricomprimi i flussi di contenuto del documento
compressor.Options.CompressContents = true;
Da sola è la meno incisiva delle tre — non aspettarti che salvi un documento pieno di foto. Si guadagna il suo posto nei documenti densi di testo con layout complesso, ed è la leva più sicura da lasciare attiva, dato che ricodificare un flusso non cambia ciò che disegna.
Tutte e tre in un'unica passata
Le tre dimensioni non sono tre esecuzioni separate. Punti un solo PdfCompressor su un file, imposti tutte le opzioni che ti servono e scrivi il risultato una sola volta con CompressToFile.
L'esempio seguente abilita il ridimensionamento e la ricompressione delle immagini al livello High, la compressione dei font con rimozione dell'incorporamento e la ricompressione dei flussi di contenuto — su un documento che contiene sia immagini ad alta risoluzione sia testo del corpo:
function App() {
const compressPdfDocument = async () => {
// Ottieni il modulo WASM di Spire.PDF
const pdfModule = window.wasmModule?.spirepdf;
// Verifica che il modulo sia pronto
if (!pdfModule) {
alert('Spire.PDF non è ancora pronto');
return;
}
// Carica il PDF da comprimere nel VFS
const inputFileName = 'ImageDocument.pdf';
await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);
// Crea un PdfCompressor e puntalo al PDF da comprimere
let compressor = new pdfModule.PdfCompressor({ filePath: inputFileName });
// 1. Compressione delle immagini: ridimensiona e ricomprimi le immagini, con un livello di qualità più alto
compressor.Options.ImageCompressionOptions.ResizeImages = true;
compressor.Options.ImageCompressionOptions.CompressImage = true;
compressor.Options.ImageCompressionOptions.ImageQuality = pdfModule.ImageQuality.High;
// 2. Compressione dei font: comprimi i dati dei font e rimuovi i font incorporati
compressor.Options.TextCompressionOptions.CompressFonts = true;
compressor.Options.TextCompressionOptions.UnembedFonts = true;
// 3. Compressione del contenuto: ricomprimi i flussi di contenuto del documento
compressor.Options.CompressContents = true;
// Definisci il nome del file di output e comprimi su di esso
const outputFileName = 'CompressedDocument.pdf';
compressor.CompressToFile(outputFileName);
// Leggi il file generato dal VFS e avvia il 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>Comprimi documento PDF</h1>
<button onClick={compressPdfDocument}>
Genera
</button>
</div>
);
}
export default App;
Documento PDF compresso combinando tutti e tre gli approcci

Due cose sulla struttura di questo codice. L'originale resta intatto nel VFS — CompressToFile scrive un nuovo documento, quindi è disponibile una scelta prima-e-dopo. E poiché il compressore lavora sulle risorse del documento anziché sulle pagine renderizzate, il testo resta testo vero: ancora selezionabile, ancora ricercabile. Solo le immagini vengono ricodificate.
Verificare cosa è cambiato
Entrambi i file risiedono nel VFS, quindi puoi confrontarli prima di consegnare il risultato all'utente anziché indovinare se le impostazioni hanno sortito qualche effetto:
// Sia l'originale sia la copia compressa sono nel VFS
const originalBytes = window.dotnetRuntime.Module.FS.readFile(inputFileName).length;
const compressedBytes = window.dotnetRuntime.Module.FS.readFile(outputFileName).length;
Mostra la differenza in percentuale accanto al download anziché offrire un semplice pulsante — indica subito all'utente se il file è ora abbastanza piccolo per la sua destinazione. Se i due numeri sono quasi identici, il peso non era dove stavi comprimendo.
Abbinare le impostazioni al documento
| Il documento | Abilita | Fai attenzione a |
|---|---|---|
| Pagine scansionate, foto, screenshot |
ResizeImages, CompressImage, ImageQuality regolata per schermo o stampa |
I dettagli fini all'interno di una scansione si ammorbidiscono per primi — verificali a High prima di pubblicare |
| Prevalentemente testo e grafica vettoriale |
CompressFonts, CompressContents
|
I guadagni sono modesti per natura; non inseguirli con le impostazioni delle immagini |
| Contenuto misto | Tutte e tre, con ImageQuality.High
|
Il profilo generico più sicuro, e di solito il punto di partenza migliore |
| Già ottimizzato per la distribuzione | Solo CompressContents
|
Poco da guadagnare; una ricodifica aggressiva delle immagini può costare qualità per quasi nulla |
Problemi comuni
Il file si è ridotto a malapena e il PDF non contiene quasi immagini.
La dimensione proviene dai font o dai flussi di contenuto. Attiva TextCompressionOptions — con UnembedFonts solo se l'ambiente di visualizzazione è noto — e aggiungi CompressContents. I documenti densi di testo rispondono a queste due e a nient'altro.
Il testo viene visualizzato diversamente dopo la compressione.
È UnembedFonts che fa esattamente ciò che dice. Riportalo a false e mantieni CompressFonts = true; i dati dei font sono comunque compressi, ma i glifi restano nel file.
Le immagini appaiono sfocate o a blocchi nell'output.
O il livello di ImageQuality è troppo basso, oppure ResizeImages ha ridotto un'immagine che aveva bisogno della sua risoluzione per la stampa. Per qualsiasi cosa che verrà stampata, parti da High.
Il file compresso ha la stessa dimensione dell'originale. Alcuni documenti sono già ottimizzati e non hanno più nulla di significativo da offrire. Verifica con il confronto in byte qui sopra anziché presumere che le impostazioni abbiano fallito.
Non succede nulla al primo clic.
Il modulo WebAssembly si carica in modo asincrono. È a questo che serve il controllo if (!pdfModule) return; — in un'applicazione reale, disabilita il pulsante finché il modulo non segnala di essere pronto invece di mostrare un avviso.
FAQ
A quale leva dovrei ricorrere per prima?
Le immagini, supponendo che siano il colpevole — ma confermalo. Se il documento è ricco di testo e sproporzionato rispetto al numero di pagine, inizia dai font e dai flussi di contenuto e lascia stare le impostazioni delle immagini.
Comprimere un PDF rende il suo testo illeggibile o non selezionabile?
No, ed è qui che un compressore basato su API si differenzia dagli strumenti online che rasterizzano ogni pagina in un JPEG. Il testo resta testo, la grafica vettoriale resta vettoriale e vengono toccati solo i bitmap — quindi la copia compressa è ancora selezionabile, ricercabile e stampabile.
Posso comprimere solo una parte di un documento?
Il compressore lavora sul documento nel suo insieme. Se hai bisogno che una parte di un file venga ridotta e una parte rimanga intatta, dividi prima il documento, comprimi la parte che ne ha bisogno e unisci di nuovo.
Posso conservare l'originale e offrire la copia compressa come scelta?
Sì. CompressToFile scrive su un nuovo nome di file e lascia l'input nel VFS, quindi entrambe le versioni sono disponibili nella stessa sessione — utile quando l'utente decide quanta qualità sacrificare.
Serve un server o può essere eseguito interamente nel browser?
Interamente. Il motore PDF è compilato in WebAssembly e i file passano attraverso il VFS, quindi il documento non lascia mai il dispositivo. Questo conta soprattutto proprio per i documenti che le persone di solito vogliono ridurre — contratti, estratti conto, registrazioni.