opção de compressão pdftk

93

Eu uso o pdftk para compactar um pdf usando a seguinte linha de comando

pdftk file1.pdf output file2.pdf compress

Funciona quando o peso do meu arquivo diminui.

Existem [opções] para alterar a compressão ???

Ou talvez outras soluções para compactar meu arquivo? É pesado porque alguns gráficos têm muitos pontos . Existe uma maneira de converter esses gráficos para jpg, por exemplo, e adaptar a compressão?

RockScience
fonte
1
Pela minha experiência, depende do que está dentro do seu pdf. Se for um gráfico com muitos pontos por exemplo, a melhor solução é converter o gráfico para png e incluir este png no pdf.
RockScience

Respostas:

122

Eu tive o mesmo problema e encontrei duas soluções diferentes (veja este tópico para mais detalhes). Ambos reduziram drasticamente o tamanho do meu PDF não compactado.

  • Pixelizado (com perdas):

    convert input.pdf -compress Zip output.pdf
    
  • Sem pixels (sem perdas, mas pode ser exibido de maneira um pouco diferente):

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=output.pdf input.pdf
    

Edit : Acabei de descobrir outra opção (para compressão sem perdas), que evita o comando gs desagradável. qpdf é uma ferramenta bacana que converte PDFs (compressão / descompressão, criptografia / descriptografia) e é muito mais rápida que o comando gs:

qpdf --linearize input.pdf output.pdf
nullglob
fonte
3
Impressionante. gs funcionou para mim, convertendo um arquivo de 4 MB para 339K. Houve uma perda de qualidade, mas serviu suficientemente ao meu propósito.
Sridhar Sarnobat,
27
Você pode usar a configuração PDF "impressora" para uma melhor qualidade:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
imriss
10
Para ajustar a qualidade (e, portanto, o tamanho), varie o valor de PDFSETTINGS. Consulte ghostscript.com/doc/current/Ps2pdf.htm#Options
1in9ui5t
6
Observe que o gscomando na resposta não é exatamente sem perdas, pois reduz a resolução e a qualidade dos JPGs incorporados. Mas é um incêndio sem perdas. texto, mantendo-o como texto, enquanto o convertcomando o converte em gráficos raster.
tanius
13
Definir a opção -dPDFSETTINGS=como /ebookoferece uma saída muito boa para mim: claro, está compactado e alguns artefatos jpg são visíveis, mas é totalmente legível para um tamanho razoável. Obrigado!
Joël
35

este procedimento funciona muito bem

pdf2ps large.pdf very_large.ps

ps2pdf very_large.ps small.pdf

De uma chance.

Jortizromo
fonte
8
Esta não é uma solução geral. Em muitos casos, o pdf resultante é maior.
rotskoff
4
Isso funcionou melhor de todas as soluções mencionadas para mim. Algumas imagens grandes caíram de 23 MB para 1,4 MB com a menor perda de qualidade.
AerandiR
1
@rotskoff Provavelmente não existe uma solução geral porque existem diferentes tipos de documentos. No entanto, vejo seu ponto. Seria bom ter um software para descobrir o que funciona melhor para nós.
tiktak
Obrigado, isso funcionou para mim, enquanto qpdf e gs não reduziram o tamanho do arquivo de saída.
sebastian
1
Conforme mencionado aqui, outra desvantagem desse método é que ele quebra os links de URL dentro do documento.
ptomato de
29

Tentando compactar um PDF fiz com tiffs de 400ppi, a maioria de 8 bits, alguns de 24 bits, com compactação PackBits, usando tiff2pdfcompactado com Zip / Deflate. Um problema que tive com cada um desses métodos: nenhum dos métodos acima preservou os marcadores TOC que eu cuidadosamente criei manualmente no Acrobat Pro X. Nem mesmo a ebookconfiguração recomendada para gs. Claro, eu poderia simplesmente abrir uma cópia do original com o TOC intacto e fazer um, Replace pagesmas, infelizmente, nenhum desses métodos fez um trabalho satisfatório para começar. Ou eles reduziram tanto o tamanho que a qualidade ficou inaceitavelmente pixelada, ou eles não reduziram o tamanho e em um caso realmente aumentaram apesar da perda de qualidade.

pdftk compress:

no change in size
bookmarks TOC are gone

gs screen:

takes a ridiculously long time and 100% CPU
errors:
    sfopen: gs_parse_file_name failed.                                 ? 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->10.2MB hideously pixellated
bookmarks TOC are gone

gs printer:

takes a ridiculously long time and 100% CPU
no errors
74.8MB-->66.1MB
light blue background on pages 1-4
bookmarks TOC are gone

gs ebook:

errors:
    sfopen: gs_parse_file_name failed.
      ./base/gsicc_manage.c:1050: gsicc_open_search(): Could not find default_rgb.ic 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->32.2MB
badly pixellated
bookmarks TOC are gone

qpdf --linearize:

very fast, a few seconds
no size change
bookmarks TOC are gone

pdf2ps:

took very long time
output_pdf2ps.ps 74.8MB-->331.6MB

ps2pdf:

pretty fast
74.8MB-->79MB
very slightly degraded with sl. bluish background
bookmarks TOC are gone
hmj6jmh
fonte
1
Esta é uma pesquisa extremamente valiosa (obrigado!), Mas também não é tanto uma resposta que por um momento pensei em votar contra.
ndemou
3
Como não é uma resposta?
hmj6jmh
21

Se o tamanho do arquivo ainda for muito grande, pode ser útil usar o ps2pdf para diminuir a resolução do arquivo PDF produzido:

pdf2ps input.pdf tmp.ps
ps2pdf -dPDFSETTINGS=/screen -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic tmp.ps output.pdf

Ajuste o valor da opção -dColorImageResolution para obter um resultado que atenda às suas necessidades (o valor descreve a resolução da imagem em DPIs). Se o arquivo de entrada estiver em tons de cinza, substituir Cor por Cinza ou usar as duas opções no comando acima também pode ajudar. É possível um ajuste fino adicional alterando a opção -dPDFSETTINGS para / default ou / printer . Para obter explicações sobre todas as opções possíveis, consulte o manual do ps2pdf .

Dominik
fonte
Obrigado pela dica. Com -dPDFSETTINGS, consegui reduzir o tamanho do meu PDF digitalizado
eshwar
1
OBRIGADO. Não acho que haja uma solução geral para o caso de uso de todos - mas tentei quase todas as soluções neste tópico e esta é a única que funcionou para mim !!! Ser capaz de "ajustar" o parâmetro dColorImageResolution era fundamental - precisava ter o tamanho do documento pequeno o suficiente para que o site do governo o aceitasse, mas grande o suficiente para ser legível. Obrigado, tio Sam, por mais um obstáculo doloroso para saltar :)
Michael Klear
3

Depois de tentar gpdf como nullglob sugeriu, descobri que obtive os mesmos resultados de compactação (um arquivo de ~ 900 MB até ~ 30 MB) apenas usando a impressora cups-pdf. Isso pode ser mais fácil / preferido se você já estiver visualizando um documento e só precisar compactar um ou dois documentos.

No Ubuntu 12.04, você pode instalar por

sudo apt-get install cups-pdf

Após a instalação, certifique-se de verificar em Ferramentas do sistema > Administração > Impressão > clique com o botão direito em 'PDF' e defina-o para 'ativar'

Por padrão, a saída é salva em uma pasta chamada PDF em seu diretório inicial.

Ryanjdillon
fonte
3

A opção pdf2ps de uma linha (por Lee) realmente aumentou o tamanho do pdf. No entanto, as duas etapas foram melhores. E pode ser combinado em um único usando o redirecionamento de & para entrada / saída padrão e canais:

pdf2ps large.pdf - | ps2pdf - small.pdf

reduziu um PDF gerado pelo xsane de 18 Mo para 630 ko!

Os links se perdem, mas para o exemplo atual, não é uma preocupação ... e foi a maneira mais fácil de se chegar ao resultado desejado.

E. Curis
fonte
Você poderia tentar ps2pdf, veja meu comentário à resposta de @Lee.
myrdd
2

pdf2ps large.pdf small.pdf é o suficiente, em vez de duas etapas

pdf2ps large.pdf very_large.ps 
ps2pdf very_large.ps small.pdf

No entanto, ps2pdf large.pdf small.pdfé uma escolha melhor.

  • ps2pdf é muito mais rápido
  • sem parâmetros adicionais especificados, pdf2psàs vezes produz um arquivo maior.
Lee
fonte
Onde você encontrou essa opção? É um recurso em alguma versão recente? Não funcionou para mim. Embora eu tenha nomeado o arquivo de saída out.pdf, ele se tornou um arquivo PS ( mimetype out.pdfdiz out.pdf: application/postscript).
myrdd
a minha é a versão mais recente 9.xx. não tenho certeza do seu.
Lee
Estou usando a versão empacotada estável do debian ("stretch"), que é 9,25. Você poderia verificar se realmente tem um arquivo pdf digitando mimetype small.pdf?
myrdd
a saída de mimetype small.pdfé small.pdf: application/pdf. Acho que o programa pode determinar o tipo de arquivo automaticamente de acordo com o sufixo.
Lee
1
@myrdd sim, fiz testes. ps2pdfé melhor.
Lee
1

Não vi muita redução no tamanho do arquivo usando qpdf. A melhor maneira que encontrei é depois que o pdftk estiver pronto, use o ghostscript para converter o pdf em postscript e depois de volta ao pdf. Em PHP, você usaria exec:

$ps = $save_path.'/psfile.ps';
exec('ps2ps2 ' . $pdf . ' ' . $ps);
unlink($pdf);
exec('ps2pdf ' .$ps . ' ' . $pdf);
unlink($ps);

Usei isso há alguns minutos para obter a saída do pdftk de 490k para 71k.

Tom
fonte
PHP adiciona uma complexidade completamente desnecessária e restringe a aplicabilidade desta resposta
ndemou
-2

Eu tive o mesmo problema e usei essa função para compactar páginas individuais, o que resulta na compactação do tamanho do arquivo em até 1/3 do tamanho original.

for (int i = 1; i <= theDoc.PageCount; i++)
{
       theDoc.PageNumber = i;
       theDoc.Flatten();
}
Gabbar
fonte
você está usando a biblioteca C ++ do pdftk?
RockScience
-2

Caso você queira compactar um PDF que contenha muito texto selecionável, no Windows você pode usar o Compressor NicePDF - escolha a opção "Flate". Depois de tentar tudo (cpdf, pdftk, gs), ele finalmente me ajudou a compactar meu PDF de 1360 páginas de 500 MB para 10 MB.

solf
fonte