Otimizar, Comprimir ou Reduzir o Tamanho de PDF em C#

Um documento PDF pode às vezes conter dados adicionais. Reduzir o tamanho de um arquivo PDF ajudará a otimizar a transferência de rede e o armazenamento. Isso é especialmente útil para publicação em páginas da web, compartilhamento em redes sociais, envio por e-mail ou arquivamento em armazenamento. Podemos usar várias técnicas para otimizar o PDF:

  • Otimizar o conteúdo da página para navegação online
  • Reduzir ou comprimir todas as imagens
  • Habilitar a reutilização do conteúdo da página
  • Mesclar fluxos duplicados
  • Desincorporar fontes
  • Remover objetos não utilizados
  • Remover campos de formulário achatados
  • Remover ou achatar anotações

Otimizar Documento PDF para a Web

Otimização, ou linearização para a Web, refere-se ao processo de tornar um arquivo PDF adequado para navegação online usando um navegador web. Para otimizar um arquivo para exibição na web:

  1. Abra o documento de entrada em um objeto Document.
  2. Salve o documento otimizado usando o método Salvar.

O seguinte trecho de código também funciona com a biblioteca Aspose.PDF.Drawing.

O seguinte trecho de código mostra como otimizar um documento PDF para a web.

// Para exemplos completos e arquivos de dados, por favor, vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");

// Otimizar para web
pdfDocument.Optimize();

dataDir = dataDir + "OptimizeDocument_out.pdf";

// Salvar documento de saída
pdfDocument.Save(dataDir);

Reduzir Tamanho do PDF

O método OptimizeResources() permite reduzir o tamanho do documento eliminando informações desnecessárias. O método OptimizeResources() permite reduzir o tamanho do documento eliminando informações desnecessárias.

  • Recursos que não são usados nas páginas do documento são removidos
  • Recursos iguais são unidos em um único objeto
  • Objetos não utilizados são deletados

O trecho abaixo é um exemplo. Note, porém, que este método não pode garantir a redução do documento.

// Para exemplos completos e arquivos de dados, por favor, vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "ShrinkDocument.pdf");
// Otimizar documento PDF. Note, porém, que este método não pode garantir a redução do documento
pdfDocument.OptimizeResources();
dataDir = dataDir + "ShrinkDocument_out.pdf";
// Salvar documento atualizado
pdfDocument.Save(dataDir);

Gestão da Estratégia de Otimização

Também podemos personalizar a estratégia de otimização. Também podemos personalizar a estratégia de otimização.

Reduzindo ou Comprimindo Todas as Imagens

Temos duas maneiras de trabalhar com imagens: reduzir a qualidade da imagem e/ou mudar sua resolução. Em qualquer caso, ImageCompressionOptions deve ser aplicado. No exemplo a seguir, reduzimos as imagens ao diminuir ImageQuality para 50.

ImageQuality funciona de maneira semelhante à qualidade JPEG, onde o valor 0 é o mais baixo e o valor 100 é o mais alto.

// Para exemplos completos e arquivos de dados, por favor vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Abrir documento
Document pdfDocument = new Document(dataDir + "Shrinkimage.pdf");
// Inicializar OptimizationOptions
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// Definir opção CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// Definir opção ImageQuality
optimizeOptions.ImageCompressionOptions.ImageQuality = 50;
// Otimizar documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "Shrinkimage_out.pdf";
// Salvar documento atualizado
pdfDocument.Save(dataDir);

Outra maneira é redimensionar as imagens para uma resolução menor. Nesse caso, devemos definir ResizeImages como verdadeiro e MaxResolution para o valor apropriado.

// Para exemplos completos e arquivos de dados, por favor, vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Inicializar Tempo
var time = DateTime.Now.Ticks;
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Abrir documento
Document pdfDocument = new Document(dataDir + "ResizeImage.pdf");
// Inicializar OptimizationOptions
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// Definir opção CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// Definir opção ImageQuality
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// Definir opção ResizeImage
optimizeOptions.ImageCompressionOptions.ResizeImages = true;
// Definir opção MaxResolution
optimizeOptions.ImageCompressionOptions.MaxResolution = 300;
// Otimizar documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "ResizeImages_out.pdf";
// Salvar documento atualizado
pdfDocument.Save(dataDir);

Outra questão importante é o tempo de execução. Mas, novamente, podemos gerenciar essa configuração também. Atualmente, podemos usar dois algoritmos - Padrão e Rápido. Para controlar o tempo de execução, devemos definir uma propriedade Versão. O seguinte trecho demonstra o algoritmo Rápido:

// Para exemplos completos e arquivos de dados, por favor, vá até https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Inicializar Tempo
var time = DateTime.Now.Ticks;
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Abrir documento
Document pdfDocument = new Document(dataDir + "Shrinkimage.pdf");
// Inicializar OptimizationOptions
var optimizeOptions = new Pdf.Optimization.OptimizationOptions();
// Definir a opção CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// Definir a opção de Qualidade de Imagem
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// Definir a Versão de Compressão de Imagem para rápido
optimizeOptions.ImageCompressionOptions.Version = Pdf.Optimization.ImageCompressionVersion.Fast;
// Otimizar o documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "FastShrinkImages_out.pdf";
// Salvar o documento atualizado
pdfDocument.Save(dataDir);
Console.WriteLine("Ticks: {0}", DateTime.Now.Ticks - time);

Removendo Objetos Não Utilizados

Um documento PDF às vezes contém objetos PDF que não são referenciados por nenhum outro objeto no documento. Isso pode acontecer, por exemplo, quando uma página é removida da árvore de páginas do documento, mas o objeto da página em si não é removido. Remover esses objetos não invalida o documento, mas sim reduz seu tamanho.

// Para exemplos completos e arquivos de dados, por favor vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Configurar a opção RemoveUsedObject
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    RemoveUnusedObjects = true
};
// Otimizar o documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Salvar o documento atualizado
pdfDocument.Save(dataDir);

Removendo Streams Não Utilizados

Às vezes, o documento contém streams de recursos não utilizados. Às vezes, o documento contém fluxos de recursos não utilizados.

// Para exemplos completos e arquivos de dados, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Configurar a opção RemoveUsedStreams
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    RemoveUnusedStreams = true
};
// Otimizar o documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Salvar o documento atualizado
pdfDocument.Save(dataDir);

Vinculando Fluxos Duplicados

Alguns documentos podem conter vários fluxos de recursos idênticos (como imagens, por exemplo). Alguns documentos podem conter vários fluxos de recursos idênticos (como imagens, por exemplo).

// Para exemplos completos e arquivos de dados, por favor, visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Definir a opção LinkDuplcateStreams
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    LinkDuplcateStreams = true
};
// Otimizar documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Salvar documento atualizado
pdfDocument.Save(dataDir);

Adicionalmente, podemos usar as configurações AllowReusePageContent. Adicionalmente, podemos usar as configurações AllowReusePageContent.

// Para exemplos completos e arquivos de dados, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Definir a opção AllowReusePageContent
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    AllowReusePageContent = true
};
Console.WriteLine("Início");
// Otimizar o documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
// Salvar o documento atualizado
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Concluído");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Tamanho do arquivo original: {0}. Tamanho do arquivo reduzido: {1}", fi1.Length, fi2.Length);

Desincorporando Fontes

Se o documento usa fontes incorporadas, significa que todos os dados da fonte estão armazenados no documento. A vantagem é que o documento pode ser visualizado independentemente de a fonte estar instalada na máquina do usuário ou não. Mas incorporar fontes torna o documento maior. O método de desincorporar fontes remove todas as fontes incorporadas. Assim, o tamanho do documento diminui, mas o próprio documento pode se tornar ilegível se a fonte correta não estiver instalada.

// Para exemplos completos e arquivos de dados, por favor, acesse https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório dos documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Configurar opção UnembedFonts
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
    UnembedFonts = true
};
Console.WriteLine("Início");
// Otimizar documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
// Salvar documento atualizado
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Concluído");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Tamanho do arquivo original: {0}. Tamanho do arquivo reduzido: {1}", fi1.Length, fi2.Length);

Os recursos de otimização aplicam esses métodos ao documento. Se algum desses métodos for aplicado, o tamanho do documento provavelmente diminuirá. Se nenhum desses métodos for aplicado, o tamanho do documento não mudará, o que é óbvio.

Métodos Adicionais para Reduzir o Tamanho do Documento PDF

Removendo ou Achatando Anotações

Anotações podem ser deletadas quando são desnecessárias. Quando são necessárias, mas não requerem edição adicional, podem ser achatadas. Ambas as técnicas reduzirão o tamanho do arquivo.

// Para exemplos completos e arquivos de dados, por favor, vá para https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Achatar anotações
foreach (var page in pdfDocument.Pages)
{
    foreach (var annotation in page.Annotations)
    {
        annotation.Flatten();
    }

}
// Salvar documento atualizado
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");

Removendo Campos de Formulários

Se o documento PDF contém AcroForms, podemos tentar reduzir o tamanho do arquivo achatando os campos de formulário.

// Para exemplos completos e arquivos de dados, por favor acesse https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Forms();

// Carregar o formulário PDF de origem
Document doc = new Document(dataDir + "input.pdf");

// Achatar os Formulários
if (doc.Form.Fields.Count() > 0)
{
    foreach (var item in doc.Form.Fields)
    {
        item.Flatten();
    }
}

dataDir = dataDir + "FlattenForms_out.pdf";
// Salvar o documento atualizado
doc.Save(dataDir);

Converter um PDF do espaço de cores RGB para escala de cinzas

Um arquivo PDF é composto por Texto, Imagem, Anexo, Anotações, Gráficos e outros objetos. Um arquivo PDF é composto por Texto, Imagem, Anexo, Anotações, Gráficos e outros objetos.

// Para exemplos completos e arquivos de dados, por favor, visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// O caminho para o diretório de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Carregar o arquivo PDF de origem
using (Document document = new Document(dataDir + "input.pdf"))
{
    Aspose.Pdf.RgbToDeviceGrayConversionStrategy strategy = new Aspose.Pdf.RgbToDeviceGrayConversionStrategy();
    for (int idxPage = 1; idxPage <= document.Pages.Count; idxPage++)
    {
        // Obter instância de uma página específica dentro do PDF
        Page page = document.Pages[idxPage];
        // Converter a imagem do espaço de cores RGB para o espaço de cores em escala de cinza
        strategy.Convert(page);
    }
    // Salvar o arquivo resultante
    document.Save(dataDir + "Test-gray_out.pdf");
}

Compressão FlateDecode

Aspose.PDF para .NET oferece suporte à compressão FlateDecode para a funcionalidade de Otimização de PDF. Aspose.PDF para .NET oferece suporte à compressão FlateDecode para a funcionalidade de Otimização de PDF.

Armazenar Imagem em XImageCollection

Aspose.PDF para .NET oferece a capacidade de armazenar novas imagens em XImageCollection com compressão FlateDecode. Para habilitar esta opção, você pode usar a bandeira ImageFilterType.Flate. O seguinte trecho de código mostra como usar essa funcionalidade: