Optimizar archivos PDF en Java

Aspose.PDF for Java expone características de optimización a través de Document.optimize, optimizeResources, y OptimizationOptions.

Optimizar un PDF con optimización general de documentos

Utilice este ejemplo cuando desee que Aspose.PDF aplique la rutina de optimización de todo el documento incorporada.

  1. Abra el PDF de origen Document.
  2. Llame optimize() en el documento.
  3. Guarde el archivo optimizado y compare los tamaños original y de salida.
public static void optimizePdf(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        document.optimize();
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Reducir el tamaño del PDF optimizando los recursos

Este ejemplo se centra en la optimización a nivel de recurso sin configurar manualmente opciones individuales.

  1. Abra el PDF de origen Document.
  2. Ejecute optimizeResources() optimizar los recursos internos.
  3. Guarde el resultado e imprime los tamaños de los archivos de entrada y salida.
public static void reduceSizePdf(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        document.optimizeResources();
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Comprimir todas las imágenes en un PDF

Utilice este enfoque cuando los documentos con muchas imágenes necesiten un tamaño de archivo más pequeño y sea aceptable una cierta reducción de la calidad de la imagen.

  1. Abra el PDF de origen Document.
  2. Cree OptimizationOptions y habilite la compresión de imágenes con el nivel de calidad requerido.
  3. Optimice los recursos del documento con esas configuraciones.
  4. Guarde el archivo optimizado y compare los tamaños de archivo.
public static void shrinkingOrCompressingAllImages(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        OptimizationOptions optimizeOptions = new OptimizationOptions();
        optimizeOptions.getImageCompressionOptions().setCompressImages(true);
        optimizeOptions.getImageCompressionOptions().setImageQuality(50);
        document.optimizeResources(optimizeOptions);
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Eliminar objetos no utilizados de un PDF

Este ejemplo elimina los objetos no usados que pueden permanecer en la estructura del documento después de ediciones o fusiones.

  1. Abra el PDF de origen Document.
  2. Cree OptimizationOptions y habilite la eliminación de objetos no utilizados.
  3. Optimice los recursos y guarde el archivo actualizado.
  4. Imprima los tamaños de archivo originales y reducidos.
public static void removingUnusedObjects(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        OptimizationOptions optimizeOptions = new OptimizationOptions();
        optimizeOptions.setRemoveUnusedObjects(true);
        document.optimizeResources(optimizeOptions);
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Eliminar flujos no utilizados de un PDF

Utilice este enfoque cuando desee descartar los datos del flujo que ya no son referenciados por el documento.

  1. Abra el PDF de origen Document.
  2. Configure OptimizationOptions para eliminar flujos no utilizados.
  3. Optimice los recursos, guarda el documento de salida y compare los tamaños de archivo.
public static void removingUnusedStreams(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        OptimizationOptions optimizeOptions = new OptimizationOptions();
        optimizeOptions.setRemoveUnusedStreams(true);
        document.optimizeResources(optimizeOptions);
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Vincular flujos duplicados en un PDF

Este ejemplo deduplica flujos repetidos para que el contenido idéntico pueda almacenarse solo una vez.

  1. Abra el PDF de origen Document.
  2. Cree OptimizationOptions y habilite la vinculación de flujos duplicados.
  3. Optimice los recursos, guarda el documento de salida y muestre los tamaños de archivo.
public static void linkingDuplicateStreams(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        OptimizationOptions optimizeOptions = new OptimizationOptions();
        optimizeOptions.setLinkDuplicateStreams(true);
        document.optimizeResources(optimizeOptions);
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Desincorporar fuentes de un PDF

Utilice esta opción cuando reducir el tamaño del archivo sea más importante que mantener los datos de fuentes incrustadas en la salida.

  1. Abra el PDF de origen Document.
  2. Configure OptimizationOptions para desincorporar fuentes.
  3. Optimice los recursos, guarde el documento y compare los tamaños de archivo.
public static void unembedFonts(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        OptimizationOptions optimizeOptions = new OptimizationOptions();
        optimizeOptions.setUnembedFonts(true);
        document.optimizeResources(optimizeOptions);
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Aplanar anotaciones en un PDF

Este ejemplo convierte las anotaciones en contenido estático de la página, de modo que ya no permanezcan como objetos interactivos.

  1. Abra el PDF de origen Document.
  2. Itere a través de cada Page y su colección Annotation.
  3. Aplane cada anotación y guarde el documento actualizado.
public static void flattenAnnotations(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        for (Page page : document.getPages()) {
            for (Annotation annotation : page.getAnnotations()) {
                annotation.flatten();
            }
        }
        document.save(outputFile.toString());
    }
}

Aplanar campos de formulario PDF

Utilice este enfoque cuando los campos de formulario rellenables deban convertirse en contenido fijo antes de la distribución o archivado.

  1. Abra el PDF de origen Document.
  2. Verifique si el documento contiene widgets de formulario.
  3. Aplane cada Field representado por un WidgetAnnotation.
  4. Guarde el archivo de salida e imprime los tamaños de archivo.
public static void flattenForms(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        if (document.getForm() != null && document.getForm().size() > 0) {
            for (WidgetAnnotation annotation : document.getForm()) {
                if (annotation instanceof Field field) {
                    field.flatten();
                }
            }
        }
        document.save(outputFile.toString());
    }
    printFileSizes(inputFile, outputFile);
}

Convertir un PDF a escala de grises

Este ejemplo cambia cada página a escala de grises, lo que puede ayudar a reducir la complejidad del color y estandarizar la salida para flujos de trabajo de archivo o impresión.

  1. Abra el PDF de origen Document.
  2. Itere a través de cada Page en el documento.
  3. Llame makeGrayscale() en cada página y guarde el archivo de salida.
public static void convertPdfFromRgbColorspaceToGrayscale(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        for (Page page : document.getPages()) {
            page.makeGrayscale();
        }
        document.save(outputFile.toString());
    }
}

Utilizar la compresión de imagen FlateDecode

Utilice este patrón cuando desee aplicar compresión basada en Flate a las imágenes durante la optimización de recursos PDF.

  1. Abra el PDF de origen Document.
  2. Cree OptimizationOptions y establezca la codificación de la imagen a ImageEncoding.Flate.
  3. Optimice los recursos del documento y guarde el archivo de salida.
public static void usingFlatedecodeCompression(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        OptimizationOptions optimizationOptions = new OptimizationOptions();
        optimizationOptions.getImageCompressionOptions().setEncoding(ImageEncoding.Flate);
        document.optimizeResources(optimizationOptions);
        document.save(outputFile.toString());
    }
}

Imprimir tamaños de archivo originales y optimizados

Este método auxiliar informa la diferencia de tamaño entre el archivo de origen y el archivo de salida optimizado.

  1. Lea el tamaño del archivo de entrada.
  2. Lea el tamaño del archivo de salida.
  3. Imprima ambos valores en un solo mensaje de estado.
private static void printFileSizes(Path inputFile, Path outputFile) throws Exception {
    System.out.println("Original file size: " + Files.size(inputFile)
            + ". Reduced file size: " + Files.size(outputFile));
}