
Um PDF raramente é apenas "grande demais". Ele é grande demais para uma porta específica — um limite de anexo de e-mail, um formulário de upload, uma cota de armazenamento — e o que o empurrou além desse limite costuma ser uma de três coisas. Comprimir sem saber qual delas é adivinhar, e adivinhar custa ou qualidade ou mais um upload malsucedido.
O Spire.PDF for JavaScript oferece um compressor com uma opção para cada um desses três lugares. Elas podem ser aplicadas separadamente ou em conjunto, e os trade-offs são suficientemente diferentes para valer a pena entender cada uma antes de decidir. Tudo é executado no navegador via WebAssembly, com arquivos transitando por um sistema de arquivos virtual (VFS), de modo que um documento não precisa ser enviado a um serviço de terceiros para ser reduzido.
Para a configuração do projeto, consulte Integrando o Spire.PDF for JavaScript em um projeto React. Os exemplos abaixo pressupõem que o pacote esteja instalado e que o módulo WebAssembly tenha sido inicializado.
O que realmente torna um PDF grande
O tamanho do arquivo em um PDF vem de três lugares diferentes, e eles não se comportam de forma alguma de maneira semelhante:
| Onde está o peso | Como se parece | Uma pista de que é a causa |
|---|---|---|
| Imagens | Bitmaps incorporados em sua própria resolução — digitalizações, fotos, capturas de tela exportadas | Poucas páginas, dezenas de megabytes |
| Fontes incorporadas | Programas de fonte armazenados dentro do arquivo para que o texto seja renderizado de forma idêntica em qualquer lugar | Predominantemente texto, ainda assim vários megabytes |
| Fluxos de conteúdo | As instruções de desenho por trás do texto e dos gráficos vetoriais | O arquivo foi editado ou salvo novamente por várias ferramentas diferentes |
Dois documentos do mesmo comprimento podem diferir em uma ordem de magnitude por causa disso: um contrato digitalizado de cinco páginas pode pesar 20 MB, enquanto um relatório de texto de cinquenta páginas fica abaixo de 1 MB. É por isso que "quanto posso comprimir isto?" não tem uma resposta única — um arquivo com muitas digitalizações tem muito a devolver, e um documento que já é predominantemente texto e arte vetorial está próximo de seu piso.
Portanto, o diagnóstico vem primeiro. Comprimir um documento com muito texto usando configurações de imagem quase não faz nada, e espremer imagens em um documento cujo peso está de fato nas fontes desperdiça qualidade sem ganho algum.
As três alavancas de compressão
O PdfCompressor expõe sua estratégia por meio de Options, e cada grupo de configurações corresponde a uma das três fontes acima:
| Opção | O que ela atinge | O que você abre mão |
|---|---|---|
ImageCompressionOptions |
Os bitmaps na página | Fidelidade da imagem — esta é a única alavanca com perdas das três |
TextCompressionOptions |
Os dados de fonte incorporados | Nada, a menos que você desincorpore as fontes, caso em que é a portabilidade |
CompressContents |
Os fluxos de conteúdo das páginas | Praticamente nada — o conteúdo é recodificado, não descartado |
As três seções seguintes abordam cada uma delas individualmente, para que o efeito de cada uma seja visível por si só. A seção seguinte as combina, que é o que você normalmente vai querer em produção.
Comprimindo as imagens
Bitmaps de alta resolução são a causa única mais comum de um PDF superdimensionado, e também é onde estão os maiores ganhos. Options.ImageCompressionOptions controla o redimensionamento e a recodificação por meio de três propriedades:
| Propriedade | O que ela faz | Quando vale a pena defini-la |
|---|---|---|
ResizeImages |
Reduz as imagens proporcionalmente e depois as recodifica | Fotos ou digitalizações capturadas muito acima da resolução em que são exibidas |
CompressImage |
Aplica recodificação com perdas às imagens | Sempre que a qualidade da imagem tiver alguma margem a ceder |
ImageQuality |
Seleciona o nível de qualidade para essa recodificação | O ajuste final — High mantém mais detalhes, Low produz um arquivo menor |
// 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 não faz nada por si só — ela apenas descreve como as imagens que passam pelas duas primeiras propriedades são codificadas, de modo que defini-la sozinha devolve o mesmo arquivo. E, como esta é a única alavanca com perdas, teste primeiro no nível High se o PDF for impresso em vez de lido na tela.
Fontes: comprimir ou desincorporar
Para que o texto seja renderizado de forma idêntica em máquinas que não possuem as fontes originais, um PDF carrega dentro do arquivo os programas de fonte usados em seu texto. Podem estar em subconjunto, mas não estão ausentes — e várias famílias em vários pesos somam. Options.TextCompressionOptions oferece duas maneiras bem diferentes de lidar com isso:
| Propriedade | O que ela faz | A ressalva |
|---|---|---|
CompressFonts |
Comprime os dados de fonte incorporados e mantém as fontes no lugar | Nenhuma para a renderização — os glifos permanecem no arquivo |
UnembedFonts |
Remove os programas de fonte e deixa o leitor substituir por fontes do sistema | Substituição de glifos ou deslocamentos de espaçamento onde essas fontes estiverem ausentes |
// Compress font data; UnembedFonts goes further and removes the embedded fonts
compressor.Options.TextCompressionOptions.CompressFonts = true;
compressor.Options.TextCompressionOptions.UnembedFonts = true;
A combinação acima é a agressiva, e é segura exatamente sob uma condição: que você saiba o que renderizará o documento. Um link de download ou um e-mail para um destinatário desconhecido não é essa condição — nesses casos, mantenha as fontes incorporadas e deixe o CompressFonts fazer o trabalho. Desincorpore apenas onde o conjunto de fontes é fixo, como em um visualizador interno com configuração conhecida.
Recomprimindo os fluxos de conteúdo
O texto e os comandos de desenho vetorial de uma página ficam nos fluxos de conteúdo. Eles são comprimidos quando o PDF é gravado, mas um documento que foi editado repetidamente, ou que passou por ferramentas diferentes, pode acumular redundância neles. Options.CompressContents recodifica esses fluxos:
// Re-compress the document content streams
compressor.Options.CompressContents = true;
Por si só, esta é a menos dramática das três — não espere que ela salve um documento repleto de fotos. Ela conquista seu lugar em documentos densos em texto com layout complexo, e é a alavanca mais segura de deixar ativada, já que recodificar um fluxo não altera o que ele desenha.
As três em uma única passagem
As três dimensões não são três execuções separadas. Você aponta um único PdfCompressor para um arquivo, define quantas opções precisar e grava o resultado uma vez com CompressToFile.
O exemplo abaixo ativa o redimensionamento e a recompressão de imagens no nível High, a compressão de fontes com desincorporação e a recompressão dos fluxos de conteúdo — em um documento que contém tanto imagens de alta resolução quanto texto corrido:
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;
Documento PDF comprimido combinando as três abordagens

Duas observações sobre o formato deste código. O original permanece intacto no VFS — CompressToFile grava um novo documento, de modo que uma escolha entre antes e depois fica disponível. E, como o compressor trabalha sobre os recursos do documento e não sobre páginas renderizadas, o texto continua sendo texto real: ainda selecionável, ainda pesquisável. Apenas as imagens são recodificadas.
Verificando o que mudou
Ambos os arquivos ficam no VFS, então você pode compará-los antes de entregar o resultado ao usuário, em vez de adivinhar se as configurações fizeram alguma coisa:
// 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;
Informe a diferença em porcentagem ao lado do download, em vez de oferecer um botão isolado — isso diz ao usuário imediatamente se o arquivo agora é pequeno o suficiente para o destino dele. Se os dois números forem quase idênticos, o peso não estava onde você estava comprimindo.
Ajustando as configurações ao documento
| O documento | Ativar | Cuidado com |
|---|---|---|
| Páginas digitalizadas, fotos, capturas de tela |
ResizeImages, CompressImage, ImageQuality ajustado para tela ou impressão |
Detalhes finos dentro de uma digitalização suavizam primeiro — verifique em High antes de publicar |
| Predominantemente texto e arte vetorial |
CompressFonts, CompressContents
|
Os ganhos são modestos por natureza; não os persiga com configurações de imagem |
| Conteúdo misto | As três, em ImageQuality.High
|
O perfil de uso geral mais seguro e, normalmente, o melhor ponto de partida |
| Já otimizado para distribuição | Apenas CompressContents
|
Pouco a ganhar; a recodificação agressiva de imagens pode custar qualidade por quase nada |
Problemas comuns
O arquivo quase não diminuiu, e o PDF quase não tem imagens.
O tamanho vem das fontes ou dos fluxos de conteúdo. Ative TextCompressionOptions — com UnembedFonts apenas se o ambiente de visualização for conhecido — e adicione CompressContents. Documentos densos em texto respondem a essas duas e a nada mais.
O texto é renderizado de forma diferente após a compressão.
Isso é o UnembedFonts fazendo exatamente o que diz. Defina-o de volta como false e mantenha CompressFonts = true; os dados de fonte continuam comprimidos, mas os glifos permanecem no arquivo.
As imagens parecem suaves ou com blocos na saída.
Ou o nível de ImageQuality está muito baixo, ou o ResizeImages reduziu uma imagem que precisava de sua resolução para impressão. Para qualquer coisa que será impressa, comece em High.
O arquivo comprimido tem o mesmo tamanho do original. Alguns documentos já estão otimizados e não têm nada significativo a ceder. Verifique com a comparação de bytes acima, em vez de presumir que as configurações falharam.
Nada acontece no primeiro clique.
O módulo WebAssembly é carregado de forma assíncrona. É para isso que serve a verificação if (!pdfModule) return; — em uma aplicação real, desabilite o botão até que o módulo informe que está pronto, em vez de mostrar um alerta.
Perguntas frequentes
Qual alavanca devo procurar primeiro?
As imagens, presumindo que elas sejam a culpada — mas confirme. Se o documento tem muito texto e está desproporcional ao seu número de páginas, comece pelas fontes e pelos fluxos de conteúdo e não mexa nas configurações de imagem.
Comprimir um PDF torna seu texto ilegível ou não selecionável?
Não, e é aí que um compressor baseado em API difere das ferramentas online que rasterizam cada página em um JPEG. O texto continua texto, a arte vetorial continua vetorial, e apenas os bitmaps são afetados — portanto a cópia comprimida continua selecionável, pesquisável e imprimível.
Posso comprimir apenas parte de um documento?
O compressor trabalha sobre o documento como um todo. Se você precisa que parte de um arquivo seja reduzida e parte fique intacta, divida o documento primeiro, comprima a parte que precisa e mescle novamente.
Posso manter o original e oferecer a cópia comprimida como opção?
Sim. CompressToFile grava em um novo nome de arquivo e deixa a entrada no VFS, de modo que ambas as versões ficam disponíveis na mesma sessão — útil quando o usuário decide quanta qualidade trocar.
Isso precisa de um servidor, ou pode ser executado inteiramente no navegador?
Inteiramente. O mecanismo de PDF é compilado para WebAssembly e os arquivos transitam pelo VFS, então o documento nunca sai do dispositivo. Isso importa sobretudo exatamente para os documentos que as pessoas costumam querer reduzir — contratos, extratos, registros.