Otimizar arquivos PDF em Java

Aspose.PDF for Java expõe recursos de otimização através Document.optimize, optimizeResources, e OptimizationOptions.

Otimizar um PDF com otimização geral de documento

Use este exemplo quando você quiser que o Aspose.PDF aplique a rotina de otimização de documento inteiro incorporada.

  1. Abra o PDF de origem em um objeto Document.
  2. Chame optimize() no documento.
  3. Salve o arquivo otimizado e compare os tamanhos original e de saída.
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);
}

Reduza o tamanho do PDF otimizando recursos

Este exemplo foca na otimização ao nível de recurso sem configurar manualmente opções individuais.

  1. Abra o PDF de origem em um objeto Document.
  2. Execute optimizeResources() para otimizar recursos internos.
  3. Salve o resultado e imprima os tamanhos dos arquivos de entrada e saída.
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);
}

Compactar todas as imagens em um PDF

Use esta abordagem quando documentos com muitas imagens precisam de um tamanho de arquivo menor e alguma redução na qualidade da imagem é aceitável.

  1. Abra o PDF de origem em um objeto Document.
  2. Crie OptimizationOptions e habilite a compactação de imagem com o nível de qualidade necessário.
  3. Otimize os recursos do documento com essas configurações.
  4. Salve o arquivo otimizado e compare os tamanhos dos arquivos.
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);
}

Remover objetos não utilizados de um PDF

Este exemplo remove objetos não utilizados que podem permanecer na estrutura do documento após edições ou mesclagens.

  1. Abra o PDF de origem em um objeto Document.
  2. Crie OptimizationOptions e habilite a remoção de objetos não utilizados.
  3. Otimize os recursos e salve o arquivo atualizado.
  4. Imprima os tamanhos do arquivo original e do reduzido.
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);
}

Remover fluxos não utilizados de um PDF

Use esta abordagem quando quiser descartar dados de fluxo que não são mais referenciados pelo documento.

  1. Abra o PDF de origem em um objeto Document.
  2. Configure OptimizationOptions para remover fluxos não utilizados.
  3. Otimize os recursos, salve o documento de saída e compare os tamanhos dos arquivos.
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 fluxos duplicados em um PDF

Este exemplo deduplica fluxos repetidos para que o conteúdo idêntico possa ser armazenado apenas uma vez.

  1. Abra o PDF de origem em um objeto Document.
  2. Crie OptimizationOptions e habilite o vínculo de fluxo duplicado.
  3. Otimize os recursos, salve o documento de saída e imprima os tamanhos dos arquivos.
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 fontes de um PDF

Use esta opção quando reduzir o tamanho do arquivo for mais importante do que manter os dados de fontes incorporadas na saída.

  1. Abra o PDF de origem em um objeto Document.
  2. Configure OptimizationOptions para desincorporar fontes.
  3. Otimize os recursos, salve o documento e compare os tamanhos dos arquivos.
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);
}

Achatar anotações em um PDF

Este exemplo converte anotações em conteúdo de página estático, de modo que elas não permanecem mais como objetos interativos.

  1. Abra o PDF de origem em um objeto Document.
  2. Itere através de cada Page e seu Annotation coleção.
  3. Aplanar todas as anotações e salvar o documento atualizado.
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 formulário PDF

Use esta abordagem quando os campos de formulário preenchíveis devem se tornar conteúdo fixo antes da distribuição ou arquivamento.

  1. Abra o PDF de origem em um objeto Document.
  2. Verifique se o documento contém widgets de formulário.
  3. Achatar cada Field representado por um WidgetAnnotation.
  4. Salve o arquivo de saída e imprima os tamanhos dos arquivos.
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);
}

Converter um PDF para escala de cinza

Este exemplo altera cada página para tons de cinza, o que pode ajudar a reduzir a complexidade de cores e padronizar a saída para fluxos de trabalho de arquivamento ou impressão.

  1. Abra o PDF de origem em um objeto Document.
  2. Itere através de cada Page no documento.
  3. Chame makeGrayscale() em cada página e salve o arquivo de saída.
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());
    }
}

Usar compressão de imagem FlateDecode

Use este padrão quando quiser aplicar compressão baseada em Flate a imagens durante a otimização de recursos PDF.

  1. Abra o PDF de origem em um objeto Document.
  2. Crie OptimizationOptions e defina a codificação da imagem para ImageEncoding.Flate.
  3. Otimize os recursos do documento e salve o arquivo de saída.
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 tamanhos de arquivos original e otimizado

Este método auxiliar relata a diferença de tamanho entre o arquivo de origem e o arquivo de saída otimizado.

  1. Leia o tamanho do arquivo de entrada.
  2. Leia o tamanho do arquivo de saída.
  3. Imprima ambos os valores em uma única mensagem de status.
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));
}