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 ...