Use o Ghostscript, mas diga para não reprocessar imagens?

23

Eu tenho um PDF que já compactou e algumas imagens de artefato, e estou usando o Ghostscript para preceder uma página de título para esse PDF.

No entanto, não consigo encontrar uma maneira de dizer ao GS para usar as imagens existentes como estão sem reprocessá-las, e agora estou me sentindo como se fosse algo a ver com o funcionamento do GS, ou seja, você não pode recompilar / linkar um PDF sem reprocessar suas imagens. Isso é verdade?

Eu posso aumentar a configuração de DPI no GS, mas ele vai de 5 MB para 60 MB, enquanto o ainda parece pior.

Existe alguma alternativa melhor para GS que fará o que eu preciso (de preferência que irá compilar no OS X)?

    
por Mahmoud Al-Qudsi 22.11.2011 / 11:34

1 resposta

37

Se você quiser apenas concatenar dois arquivos PDF sem qualquer reprocessamento de seu conteúdo, pdftk é para você. (No Mac OS X isso deve estar disponível via MacPorts ou Fink, para Linux, existem pacotes nativos para todas as principais distribuições; para Windows, olhe aqui. ) Tente isto:

 pdftk title.pdf content.pdf cat output book.pdf

Isto irá colocar o title.pdf no content.pdf e escrever o resultado em book.pdf .

pdftk é uma maneira "burra", mas muito rápida de concatenar dois (ou mais) arquivos PDF. "Mudo" até o momento, já que pdftk não interpreta de forma alguma o fluxo de dados PDF, apenas garante que os números dos objetos internos sejam re-re-modificados conforme a necessidade e apareçam no PDF xref structure (que basicamente é uma espécie de PDF ToC para objetos).

Ghostscript:

Se você quiser usar o Ghostscript, o comando básico para concatenar os mesmos dois arquivos seria:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

No entanto, conforme você passou, essa linha de comando simples pode atrapalhar a qualidade da sua imagem. A razão é que o Ghostscript não é 'dump' quando processa PDFs: ele o interpreta completamente ao ler e cria um arquivo completamente novo ao escrever o resultado. Para criar o resultado, ele usará automaticamente as configurações padrão para muitos detalhes no processamento geral. Esses padrões serão aplicados a todos os casos em que suas invocações não instruíram o Ghostscript em contrário.

O método do Ghostscript para criar o novo book.pdf é muito mais "inteligente" (mas também muito mais lento) do que o método pdftk . (Esta também é a razão pela qual o Ghostscript, em muitos casos, é capaz de "reparar" arquivos PDF do b0rken, ou incorporar fontes nos PDFs de saída que não estão embutidos nos PDFs de entrada, ou remover duplicatas imagens, substituindo-as por meras referências, etc. - e, em geral, criaram arquivos menores e melhor otimizados a partir de PDFs de entrada inchados ...)

A solução é não permitir que o Ghostscript use seus padrões: adicionando mais parâmetros personalizados à linha de comando.

O que significa "Ghostscript 'interpreta" sua entrada em PDF "?

Todo o arquivo e seu conteúdo (objetos, fluxos, fontes, imagens, ...) são lidos, verificados e mantidos em sua própria representação interna, antes de cuspir novamente o PDF resultante com seus objetos PDF. No entanto, quando "cuspindo", o Ghostscript aplicará todas as suas configurações padrão internas para as centenas de parâmetros [*] que estão disponíveis.

Infelizmente, isso causa o "reprocessamento" de imagens de acordo com essas configurações padrão - que só podem ser evitadas ou substituídas adicionando-se seus próprios parâmetros de linha de comando (desejados).

Seus problemas de imagem podem ser causados pela necessidade do Ghostscript (devido a problemas de licenciamento) de recodificar imagens JPEG2000 para codificação JPEG. Se você quiser evitar isso, adicione o seguinte à sua linha de comando:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

Outras opções de linha de comando relacionadas à imagem a considerar para inclusão são:

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

Portanto, a linha de comando completa do Ghostscript que pode fazer você feliz deve ler:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

Você também pode dizer ao Ghostscript NÃO para compactar imagens em todos no PDF de saída, usando esta linha de comando:

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf

.

[*]:
Se você estiver interessado em aprender sobre uma lista completa de configurações padrão que o dispositivo pdfwrite do Ghostscript está usando , execute o seguinte comando. Ele retorna a lista completa :

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

Para explicações sobre o que exatamente todos esses parâmetros significam, você terá que ler no Documentação da Adobe sobre" Parâmetros do Distiller ". Ghostscript se esforça muito para imitar todos esses ...

    
por 02.01.2012 / 10:12