Optimizar, Comprimir o Reducir el Tamaño de PDF en C#
Un documento PDF a veces puede contener datos adicionales. Reducir el tamaño de un archivo PDF te ayudará a optimizar la transferencia de red y el almacenamiento. Esto es especialmente útil para publicar en páginas web, compartir en redes sociales, enviar por correo electrónico o archivar en almacenamiento. Podemos usar varias técnicas para optimizar PDF:
- Optimizar el contenido de la página para navegación en línea
- Reducir o comprimir todas las imágenes
- Habilitar la reutilización del contenido de la página
- Fusionar flujos duplicados
- Desincrustar fuentes
- Eliminar objetos no utilizados
- Eliminar campos de formulario aplanados
- Eliminar o aplanar anotaciones
Optimizar Documento PDF para la Web
La optimización, o linearización para Web, se refiere al proceso de hacer que un archivo PDF sea adecuado para la navegación en línea usando un navegador web. Para optimizar un archivo para visualización web:
- Abre el documento de entrada en un objeto Document.
- Guarde el documento optimizado utilizando el método Save.
El siguiente fragmento de código también funciona con la biblioteca Aspose.PDF.Drawing.
El siguiente fragmento de código muestra cómo optimizar un documento PDF para la web.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Optimizar para la web
pdfDocument.Optimize();
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Guardar el documento de salida
pdfDocument.Save(dataDir);
Reducir Tamaño PDF
El método OptimizeResources() le permite reducir el tamaño del documento eliminando la información innecesaria. El método OptimizeResources() te permite reducir el tamaño del documento eliminando la información innecesaria.
- Se eliminan los recursos que no se utilizan en las páginas del documento
- Los recursos iguales se unen en un solo objeto
- Se eliminan los objetos no utilizados
El fragmento a continuación es un ejemplo. Sin embargo, ten en cuenta que este método no puede garantizar la reducción del tamaño del documento.
// Para ejemplos completos y archivos de datos, por favor visita https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "ShrinkDocument.pdf");
// Optimizar el documento PDF. Ten en cuenta, sin embargo, que este método no puede garantizar la reducción del tamaño del documento
pdfDocument.OptimizeResources();
dataDir = dataDir + "ShrinkDocument_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Gestión de la Estrategia de Optimización
También podemos personalizar la estrategia de optimización. También podemos personalizar la estrategia de optimización.
Reducir o Comprimir Todas las Imágenes
Tenemos dos formas de trabajar con imágenes: reducir la calidad de la imagen y/o cambiar su resolución. En cualquier caso, se deben aplicar ImageCompressionOptions. En el siguiente ejemplo, reducimos las imágenes disminuyendo ImageQuality a 50.
ImageQuality
funciona de manera similar a la calidad JPEG, donde el valor 0 es el más bajo y el valor 100 es el más alto.
// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio 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();
// Establecer la opción CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// Establecer la opción ImageQuality
optimizeOptions.ImageCompressionOptions.ImageQuality = 50;
// Optimizar el documento PDF utilizando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "Shrinkimage_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Otra forma es redimensionar las imágenes a una resolución más baja. En este caso, debemos establecer ResizeImages en verdadero y MaxResolution al valor apropiado.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Inicializar Tiempo
var time = DateTime.Now.Ticks;
// La ruta al directorio 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();
// Establecer la opción CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// Establecer la opción ImageQuality
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// Establecer la opción ResizeImage
optimizeOptions.ImageCompressionOptions.ResizeImages = true;
// Establecer la opción MaxResolution
optimizeOptions.ImageCompressionOptions.MaxResolution = 300;
// Optimizar el documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "ResizeImages_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Otro tema importante es el tiempo de ejecución. Pero de nuevo, también podemos gestionar esta configuración. Actualmente, podemos usar dos algoritmos: Estándar y Rápido. Para controlar el tiempo de ejecución debemos establecer una propiedad Versión. El siguiente fragmento demuestra el algoritmo Rápido:
// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// Inicializar Tiempo
var time = DateTime.Now.Ticks;
// La ruta al directorio 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();
// Establecer la opción CompressImages
optimizeOptions.ImageCompressionOptions.CompressImages = true;
// Establecer la opción ImageQuality
optimizeOptions.ImageCompressionOptions.ImageQuality = 75;
// Establecer la Versión de Compresión de Imagen a rápido
optimizeOptions.ImageCompressionOptions.Version = Pdf.Optimization.ImageCompressionVersion.Fast;
// Optimizar el documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "FastShrinkImages_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Console.WriteLine("Ticks: {0}", DateTime.Now.Ticks - time);
Eliminación de Objetos No Utilizados
Un documento PDF a veces contiene objetos PDF que no están referenciados por ningún otro objeto en el documento. Esto puede suceder, por ejemplo, cuando se elimina una página del árbol de páginas del documento pero el objeto de la página en sí no se elimina. Eliminar estos objetos no hace que el documento sea inválido, sino que lo reduce.
// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Establecer la opción RemoveUsedObject
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
RemoveUnusedObjects = true
};
// Optimizar el documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Eliminación de Flujos No Utilizados
A veces el documento contiene flujos de recursos no utilizados. A veces el documento contiene flujos de recursos no utilizados.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Establecer la opción RemoveUsedStreams
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
RemoveUnusedStreams = true
};
// Optimizar el documento PDF utilizando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Vinculando flujos duplicados
Algunos documentos pueden contener varios flujos de recursos idénticos (como imágenes, por ejemplo). Algunos documentos pueden contener varios flujos de recursos idénticos (como imágenes, por ejemplo).
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Establecer la opción LinkDuplcateStreams
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
LinkDuplcateStreams = true
};
// Optimizar el documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
dataDir = dataDir + "OptimizeDocument_out.pdf";
// Guardar el documento actualizado
pdfDocument.Save(dataDir);
Adicionalmente, podemos usar la configuración de AllowReusePageContent. Adicionalmente, podemos usar la configuración de AllowReusePageContent.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Configurar la opción AllowReusePageContent
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
AllowReusePageContent = true
};
Console.WriteLine("Inicio");
// Optimizar el documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
// Guardar el documento actualizado
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Finalizado");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Tamaño del archivo original: {0}. Tamaño del archivo reducido: {1}", fi1.Length, fi2.Length);
Desincrustar Fuentes
Si el documento utiliza fuentes incrustadas, significa que todos los datos de la fuente se almacenan en el documento. La ventaja es que el documento se puede ver independientemente de si la fuente está instalada en la máquina del usuario o no. Pero incrustar fuentes hace que el documento sea más grande. El método de desincrustar fuentes elimina todas las fuentes incrustadas. Por lo tanto, el tamaño del documento disminuye, pero el documento en sí puede volverse ilegible si no está instalada la fuente correcta.
// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Establecer la opción UnembedFonts
var optimizeOptions = new Pdf.Optimization.OptimizationOptions
{
UnembedFonts = true
};
Console.WriteLine("Inicio");
// Optimizar el documento PDF usando OptimizationOptions
pdfDocument.OptimizeResources(optimizeOptions);
// Guardar el documento actualizado
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Finalizado");
var fi1 = new System.IO.FileInfo(dataDir + "OptimizeDocument.pdf");
var fi2 = new System.IO.FileInfo(dataDir + "OptimizeDocument_out.pdf");
Console.WriteLine("Tamaño de archivo original: {0}. Tamaño de archivo reducido: {1}", fi1.Length, fi2.Length);
Los recursos de optimización aplican estos métodos al documento. Si se aplican alguno de estos métodos, el tamaño del documento probablemente disminuirá. Si no se aplica ninguno de estos métodos, el tamaño del documento no cambiará, lo cual es obvio.
Formas adicionales de reducir el tamaño del documento PDF
Eliminación o aplanamiento de anotaciones
Las anotaciones pueden eliminarse cuando no son necesarias. Cuando son necesarias pero no requieren edición adicional, pueden aplanarse. Ambas técnicas reducirán el tamaño del archivo.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Abrir documento
Document pdfDocument = new Document(dataDir + "OptimizeDocument.pdf");
// Aplanar anotaciones
foreach (var page in pdfDocument.Pages)
{
foreach (var annotation in page.Annotations)
{
annotation.Flatten();
}
}
// Guardar documento actualizado
pdfDocument.Save(dataDir + "OptimizeDocument_out.pdf");
Eliminación de Campos de Formulario
Si el documento PDF contiene AcroForms, podemos intentar reducir el tamaño del archivo aplanando los campos de formulario.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Cargar el formulario PDF fuente
Document doc = new Document(dataDir + "input.pdf");
// Aplanar Formularios
if (doc.Form.Fields.Count() > 0)
{
foreach (var item in doc.Form.Fields)
{
item.Flatten();
}
}
dataDir = dataDir + "FlattenForms_out.pdf";
// Guardar el documento actualizado
doc.Save(dataDir);
Convertir un PDF del espacio de color RGB a escala de grises
Un archivo PDF comprende Texto, Imagen, Adjunto, Anotaciones, Gráficos y otros objetos. Un archivo PDF comprende Texto, Imagen, Adjunto, Anotaciones, Gráficos y otros objetos.
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Cargar archivo PDF fuente
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++)
{
// Obtener instancia de una página particular dentro del PDF
Page page = document.Pages[idxPage];
// Convertir la imagen de espacio de color RGB a espacio de color Escala de Grises
strategy.Convert(page);
}
// Guardar el archivo resultante
document.Save(dataDir + "Test-gray_out.pdf");
}
Compresión FlateDecode
Aspose.PDF para .NET proporciona soporte de compresión FlateDecode para la funcionalidad de Optimización de PDF. Aspose.PDF para .NET proporciona soporte de compresión FlateDecode para la funcionalidad de optimización de PDF.
Almacenar Imagen en XImageCollection
Aspose.PDF para .NET proporciona la capacidad de almacenar nuevas imágenes en XImageCollection con compresión FlateDecode. Para habilitar esta opción puedes usar la bandera ImageFilterType.Flate. El siguiente fragmento de código muestra cómo utilizar esta funcionalidad: