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


30

Eu tenho um PDF que já compactou imagens e é um pouco artefato e estou usando o Ghostscript para anexar uma página de título a esse PDF.

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

Posso aumentar a configuração de DPI no GS, mas passará de 5 MB para 60 MB enquanto ainda estiver pior.

Existe alguma alternativa melhor ao GS que faça o que eu preciso (de preferência que seja compilado no OS X)?


Você pode editar sua pergunta e citar a linha de comando exata que você está usando para anexar sua página de título ao PDF original? Então eu poderia dizer-lhe o que exatamente a mudança ou adicionar à linha de comando, a fim de obter uma melhor saída para imagens ...
Kurt Pfeifle

Não quero apenas parecer melhor, quero mesclar sem reprocessar. Isso resultará em) melhor qualidade (transformações sem perdas) eb) não perder horas de tempo de CPU processando meu documento de mais de 1000 páginas.
Mahmoud Al-Qudsi

1
Ei, você não respondeu minha pergunta e não citou a linha de comando GS exata que está usando. O que significa: você não estará recebendo a ajuda sobre GS você está procurando ...
Kurt Pfeifle

Respostas:


44

Se você apenas deseja concatenar dois arquivos PDF sem reprocessar 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, veja aqui. ) Tente o seguinte:

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

Anexará o title.pdf ao content.pdf e gravará o resultado em book.pdf .

pdftké uma maneira "burra", mas muito rápida, de concatenar dois (ou mais) arquivos PDF. "Dumb" até o momento, pois de pdftkforma alguma interpreta o fluxo de dados em PDF, apenas garante que os números de objetos internos sejam reorganizados conforme o necessário e apareçam na xrefestrutura do PDF (que basicamente é uma espécie de ToC do PDF para objetos).

Ghostscript:

Se você deseja 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, como você experimentou, essa linha de comando simples pode atrapalhar a qualidade da imagem. O motivo é que o Ghostscript não é 'despejo' quando processa PDFs: ele os interpreta completamente durante a leitura e cria um arquivo completamente novo ao gravar o resultado. Para criar o resultado, ele usará automaticamente as configurações padrão para muitos detalhes no processamento geral. Esses padrões se aplicam a todos os casos em que suas invocações não instruíram o Ghostscript de outra forma.

Portanto, o método do Ghostscript para criar o novo book.pdf é muito mais "inteligente" (mas também muito mais lento) do que pdftko método. (Esse também é o motivo pelo qual o Ghostscript, em muitos casos, é capaz de - dentro dos limites - "reparar" arquivos PDF b0rken, ou incorporar fontes nos PDFs de saída que não estão incorporados nos PDFs de entrada ou remover imagens duplicadas, substituindo eles por meras referências, etc. - e, em geral, cria 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 o PDF resultante com seus objetos PDF novamente. No entanto, ao 'cuspir', o Ghostscript aplicará todas as suas configurações padrão internas para as centenas de parâmetros [*] disponíveis.

Infelizmente, isso causa seu "reprocessamento" de imagens de acordo com essas configurações padrão - que só podem ser evitadas ou substituídas adicionando 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 em codificação JPEG. Se você deseja 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 serem consideradas 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 para não compactar as imagens 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 das configurações padrão que o dispositivo pdfwrite do Ghostscript está usando , execute o seguinte comando. Retorna a lista completa :

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

Para obter explicações sobre o que exatamente todos esses parâmetros significam, você precisará ler a documentação da Adobe sobre "Parâmetros do destilador" . Ghostscript tenta muito imitar tudo isso ...


3
(FYI) No meu caso, as bandeiras dEncodeColorImages, dEncodeGrayImages, dEncodeMonoImagescausa o arquivo de saída para se tornar muito mais maciça. Ao removê-los, o tamanho do arquivo foi alterado de 22 MB para 3,1 MB e a qualidade da imagem parece exatamente com o uso desses sinalizadores. Todas as únicas bandeiras com eu uso são: dColorConversionStrategy=/LeaveColorUnchanged, dDownsampleMonoImages=false, dDownsampleGrayImages=false, dDownsampleColorImages=false, dAutoFilterColorImages=false, dAutoFilterGrayImages=false, dColorImageFilter=/FlateEncode,dGrayImageFilter=/FlateEncode
Dor

@Kurt Pfeifle Que opções são permitidas -dColorImageFilter? Eu só posso encontrar FlateEncodee DCTEncode. O DCT parece fazer JPEG (por que eles criptografaram isso?). Acho que o FLATE é uma opção desatualizada para imagens agora, já que a patente do Bell Labs no LZW não é mais um problema? No entanto, depois de passar algum tempo pesquisando, não consigo encontrar como usar PNG (ou qualquer outra coisa) ... Minhas imagens originais são PNG e quero que elas permaneçam inalteradas. Eu tentei a opção -c, mas isso me dá -c can only be used in a built with POSTSCRIPT included....
Louis Somers
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.