Como saber se um arquivo PDF está compactado ou não e (des) compactá-lo

18

Acabei de aprender que os arquivos PDF podem ser compactados para reduzir o tamanho do disco.

  1. Eu queria saber como saber se um arquivo PDF já foi compactado?
  2. Quais aplicativos / comandos podem ser usados ​​para compactar ou descompactar um arquivo PDF?

Meu ambiente é Linux Ubuntu 10.10.


Algumas tentativas não dão resultados satisfatórios:

  1. Aqui estão os resultados de tentar pdftk:

    $ pdftk 3.pdf output 5.pdf uncompress 
    $ pdftk 3.pdf output 3comp.pdf compress 
    $ ls -l 3.pdf 3comp.pdf 5.pdf
    -rwxrwx--- 1 root plugdev  8652269 2011-07-30 12:27 3comp.pdf
    -rwxrwx--- 1 root plugdev  8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 16829828 2011-07-30 12:27 5.pdf
    

    As propriedades dos arquivos mostram que todos eles não são otimizados.

  2. Resultados da conversão para ps e depois para o pdf:

    $ pdf2ps 3.pdf 3.ps
    $ ps2pdf 3.ps 3c.pdf
    $ ls -l 3.pdf 3.ps 3c.pdf
    -rwxrwx--- 1 root plugdev   8808946 2011-07-30 13:14 3c.pdf
    -rwxrwx--- 1 root plugdev   8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 122375966 2011-07-30 13:14 3.ps
    
Tim
fonte
Não posso testá-lo agora, já que não tenho um PDF compactado em mãos, mas tente file. Deve mostrar se o arquivo está compactado ou não.
Polemon
1
@polemon: Obrigado! Não faz. O posto de saída $file 3.pdfé3.pdf: PDF document, version 1.4
Tim
Observe que os fluxos individuais no arquivo PDF podem ser compactados. Portanto, perguntar "o arquivo PDF inteiro está compactado" é a pergunta errada (embora, em muitos casos, todos ou a maioria dos fluxos sejam compactados ou descompactados).
dirkt

Respostas:

30

em resumo:

Para saber se já está compactado:

strings your.pdf | grep /Filter

Para (des) compactar um PDF, use QPDF

qpdf --stream-data=compress your.pdf compressed.pdf
qpdf --stream-data=uncompress compressed.pdf uncompressed.pdf  

explicação:

A palavra-chave "Filtro" dentro de um arquivo pdf é um indicador do método de compactação usado. Alguns deles são:

CCITT G3 / G4 - usado para imagens monocromáticas
JPEG - um algoritmo com perdas usado para imagens
JPEG2000 - uma alternativa mais moderna ao JPEG, que também é usada para compactar imagens
Flate - usada para compactar texto e imagens
JBIG2 - uma alternativa para Compactação CCITT para imagens monocromáticas
LZW - usada para compactar texto e imagens, mas sendo substituída pelo Flate
RLE - usada para imagens monocromáticas
ZIP - usada para imagens em escala de cinza ou coloridas

(copiado daqui ).

No entanto, dada a estrutura complexa de arquivos do PDF, na maioria das vezes, parte (ou "fluxo") do PDF já será compactada de alguma forma (e será exibida ao grepping / Filter) enquanto outra parte não será, portanto não há resposta SIM / NÃO para a pergunta se o PDF está compactado.
Uma maneira de superar isso seria adicionar a -copção ao grep, que retorna o número de ocorrências, para que você possa ver relativamente quão bem está compactado. por exemplo, se retornar menos de 10, será bastante não compactado.strings "large.pdf" | grep -c /Filter

Outra propriedade relacionada ao tamanho em PDFs é se eles foram otimizados para acesso rápido, com PDFs "otimizados" sendo de tamanho maior, para citar a wikipedia :

Existem dois layouts para os arquivos PDF - não lineares (não "otimizados") e lineares ("otimizados"). Arquivos PDF não lineares consomem menos espaço em disco que seus equivalentes lineares, embora tenham um acesso mais lento, porque partes dos dados necessários para montar as páginas do documento estão espalhadas pelo arquivo PDF. Os arquivos PDF lineares (também chamados de arquivos PDF "otimizados" ou "otimizados para a Web") são construídos de maneira a permitir que sejam lidos em um plug-in de navegador da Web sem aguardar o download do arquivo inteiro, pois eles são gravados no disco em um moda linear (como na ordem das páginas). Os arquivos PDF podem ser otimizados usando o software Adobe Acrobat ou QPDF.

Você pode verificar se o PDF está otimizado usando pdfinfo your.pdf.

Philomath
fonte
Obrigado! (1) Os resultados do uso do qpdf são semelhantes aos do pdftk: com o compress, o tamanho se tornou um pouco maior (estranho) e, com a descompactação, o tamanho se tornou muito maior, quase o dobro. (2) O pdftk e o gpdf tentam realizar a mesma coisa, usando as opções de compactação e descompactação?
Tim
@ Tim: (desculpe, eu não estava aqui). para (1), como expliquei, o PDF já está parcialmente compactado (provavelmente), é por isso que a compactação não economiza muito (e a descompactação a torna muito maior, porque descompacta todos os fluxos compactados). (2) provavelmente qpdfe pdftkfaz mais ou menos a mesma coisa com relação à compactação, mas também qpdfpode otimizar (além de muitas outras coisas).
Philomath
10

O pdftk é uma ferramenta para executar algumas operações em arquivos PDF, como compactação / descompactação:

$ pdftk test.pdf output compressed_test.pdf compress
uloBasEI
fonte
Obrigado! Eu queria saber como saber se um arquivo pdf já foi compactado?
Tim
1
@ Tim: pdfinfo file.pdfinforma se um PDF é otimizado . No entanto, não tenho certeza se isso significa compactado ou não.
Nico
1
@uloBasEI: Eu tentei seu comando usando o pdftk para compactação, mas o tamanho quase não mudou. Se eu descompactar, o tamanho do arquivo será dobrado. As propriedades do arquivo original, do arquivo compactado e dos arquivos descompactados mostram que não estão otimizadas.
Tim
@nico: Obrigado! Veja meu comentário acima e minha atualização. Parece que compressão e otimização não se implicam?
Tim
@ Tim: veja também isso: pandemoniumillusion.wordpress.com/2008/05/07/…
nico
1

Encontrei o método de compactação no arquivo pdf. Abra o PDF com o editor de texto. Execute um CCITT de pesquisa ou localização, se não for encontrado, digite JPEG, Flate, JBIG2, LZW, RZ e RLE e ZIP.
Parece pior do que é! Muito fácil de encontrar o método de compactação do fluxo de dados.

bizhubkey1
fonte
Isso é bastante duvidoso. Usei seu método para verificar um arquivo PDF descompactado (descompactado pelo qpdf) usando grep como em grep -E "(CCITT | JPEG | Flate | LZW | RLE | ZIP)" uncompressed.pdf e ele retorna essa mensagem Arquivo binário descompactado.pdf jogos . Parece que ele detecta o arquivo não compactado.pdf para conter os padrões LZW e RLE.
user91822 29/06
-1

Basta verificar suas propriedades; dirá se o arquivo está compactado ou não.

rosni
fonte
Eu acho que a pergunta Heidi é com qual programa verificar as propriedades, em particular com programas baseados em linha de comando com script.
Caleb
> Basta verificar suas propriedades - qual programa [de código aberto] poderia ser usado para fazer isso?
Maxim