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:
- Abra o documento de entrada em um objeto Document.
- 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: