Otimizar, Comprimir ou Reduzir Tamanho de PDF em Python

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
  • Permitir reutilização de 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. Use o método Optimize.
  3. Salve o documento otimizado usando o método save().

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


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)

    # Otimizar para a web
    document.optimize()

    # Salvar documento de saída
    document.save(output_pdf)

Reduzir Tamanho do PDF

O método OptimizeResources() permite reduzir o tamanho do documento eliminando informações desnecessárias. Por padrão, este método funciona da seguinte forma:

  • 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. No entanto, observe que este método não pode garantir a redução do documento.


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Otimizar documento PDF. No entanto, observe que este método não pode garantir a redução do documento
    document.optimize_resources()
    # Salvar documento atualizado
    document.save(output_pdf)

Gerenciamento de Estratégia de Otimização

Também podemos personalizar a estratégia de otimização. Atualmente, o método OptimizeResources() usa 5 técnicas. Essas técnicas podem ser aplicadas usando o método OptimizeResources() com o parâmetro OptimizationOptions.

Reduzindo ou Compactando Todas as Imagens

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


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Inicializar OptimizationOptions
    optimizeOptions = ap.optimization.OptimizationOptions()
    # Definir opção CompressImages
    optimizeOptions.image_compression_options.compress_images = True
    # Definir opção ImageQuality
    optimizeOptions.image_compression_options.image_quality = 50
    # Otimizar documento PDF usando OptimizationOptions
    document.optimize_resources(optimizeOptions)
    # Salvar documento atualizado
    document.save(output_pdf)

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 próprio objeto de página não é removido. Remover esses objetos não torna o documento inválido, mas sim o encolhe.


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Definir a opção RemoveUsedObject
    optimizeOptions = ap.optimization.OptimizationOptions()
    optimizeOptions.remove_unused_objects = True

    # Otimizar documento PDF usando OptimizationOptions
    document.optimize_resources(optimizeOptions)
    # Salvar documento atualizado
    document.save(output_pdf)

Removendo Fluxos Não Utilizados

Às vezes, o documento contém fluxos de recursos não utilizados. Esses fluxos não são “objetos não utilizados” porque são referenciados a partir de um dicionário de recursos de página. Assim, eles não são removidos com um método de “remover objetos não utilizados”. Mas esses fluxos nunca são usados com o conteúdo da página. Isso pode acontecer em casos quando uma imagem foi removida da página, mas não dos recursos da página. Além disso, essa situação geralmente ocorre quando páginas são extraídas do documento e as páginas do documento têm recursos “comuns”, ou seja, o mesmo objeto de Recursos. O conteúdo das páginas é analisado para determinar se um fluxo de recursos é usado ou não. Fluxos não utilizados são removidos. Isso às vezes diminui o tamanho do documento. O uso dessa técnica é semelhante ao passo anterior:


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Definir a opção RemoveUsedStreams
    optimizeOptions = ap.optimization.OptimizationOptions()
    optimizeOptions.remove_unused_streams = True
    # Otimizar documento PDF usando OptimizationOptions
    document.optimize_resources(optimizeOptions)
    # Salvar documento atualizado
    document.save(output_pdf)

Vinculando Fluxos Duplicados

Alguns documentos podem conter vários fluxos de recursos idênticos (como imagens, por exemplo). Isso pode acontecer, por exemplo, quando um documento é concatenado consigo mesmo. O documento de saída contém duas cópias independentes do mesmo fluxo de recursos. Analisamos todos os fluxos de recursos e os comparamos. Se os fluxos são duplicados, eles são mesclados, ou seja, apenas uma cópia é mantida. As referências são alteradas adequadamente, e as cópias do objeto são removidas. Em alguns casos, isso ajuda a diminuir o tamanho do documento.


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Definir a opção LinkDuplcateStreams
    optimizeOptions = ap.optimization.OptimizationOptions()
    optimizeOptions.link_duplcate_streams = True
    # Otimizar o documento PDF usando OptimizationOptions
    document.optimize_resources(optimizeOptions)
    # Salvar documento atualizado
    document.save(output_pdf)

Desincorporando Fontes

Se o documento usa fontes incorporadas, isso 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 a incorporação de fontes torna o documento maior. O método de remover fontes incorporadas 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.


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Definir a opção UnembedFonts
    optimizeOptions = ap.optimization.OptimizationOptions()
    optimizeOptions.unembed_fonts = True
    # Otimizar o documento PDF usando OptimizationOptions
    document.optimize_resources(optimizeOptions)
    # Salvar documento atualizado
    document.save(output_pdf)
    file_stats_1 = os.stat(input_pdf)
    file_stats_2 = os.stat(output_pdf)
    print(
        "Tamanho do arquivo original: {}. Tamanho do arquivo reduzido: {}".format(
            file_stats_1.st_size, file_stats_2.st_size
        )
    )

Os recursos de otimização aplicam esses métodos ao documento. Se qualquer um 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.

Formas Adicionais de Reduzir o Tamanho do Documento PDF

Removendo ou Achatando Anotações

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


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)
    # Achar anotações
    for page in document.pages:
        for annotation in page.annotations:
            annotation.flatten()

    # Salvar documento atualizado
    document.save(output_pdf)

Removendo Campos de Formulário

Se o documento PDF contiver AcroForms, podemos tentar reduzir o tamanho do arquivo achatando os campos do formulário.


    import aspose.pdf as ap

    # Carregar formulário PDF de origem
    doc = ap.Document(input_pdf)

    # Achar Formulários
    if len(doc.form.fields) > 0:
        for item in doc.form.fields:
            item.flatten()

    # Salvar o documento atualizado
    doc.save(output_pdf)

Converter um PDF de espaço de cor RGB para escala de cinza

Um arquivo PDF é composto por Texto, Imagem, Anexo, Anotações, Gráficos e outros objetos. Pode surgir a necessidade de converter um PDF de espaço de cor RGB para escala de cinza para que a impressão desses arquivos PDF seja mais rápida. Além disso, quando o arquivo é convertido para escala de cinza, o tamanho do documento também é reduzido, mas isso pode causar uma diminuição na qualidade do documento. Este recurso é atualmente suportado pelo recurso Pre-Flight do Adobe Acrobat, mas quando falamos de automação de escritório, o Aspose.PDF é uma solução definitiva para fornecer tais vantagens para manipulações de documentos. Para realizar essa tarefa, o seguinte trecho de código pode ser usado.


    import aspose.pdf as ap

    # Carregar o arquivo PDF de origem
    document = ap.Document(input_pdf)
    strategy = ap.RgbToDeviceGrayConversionStrategy()
    for page in document.pages:
        # Converter a imagem do espaço de cor RGB para o espaço de cor em escala de cinza
        strategy.convert(page)

    # Salvar o arquivo resultante
    document.save(output_pdf)

Compressão FlateDecode

Aspose.PDF para Python via .NET oferece suporte à compressão FlateDecode para a funcionalidade de Otimização de PDF. O trecho de código abaixo mostra como usar a opção de Otimização para armazenar imagens com compressão FlateDecode:


    import aspose.pdf as ap

    # Abrir Documento
    doc = ap.Document(input_pdf)
    # Inicializar OptimizationOptions
    optimizationOptions = ap.optimization.OptimizationOptions()
    # Para otimizar imagem usando Compressão FlateDecode, definir opções de otimização para Flate
    optimizationOptions.image_compression_options.encoding = ap.optimization.ImageEncoding.FLATE
    # Definir Opções de Otimização
    doc.optimize_resources(optimizationOptions)
    # Salvar Documento
    doc.save(output_pdf)