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 pdftk
forma 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 xref
estrutura 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 pdftk
o 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 ...