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