Mesclar pdf e remover páginas em um passo

1

Eu gostaria de concatenar documentos em pdf sem perder nenhuma informação (resampling de imagem, etc.). Eu só quero fazer compressões sem perdas, consolidar fontes, etc.

Antes de mesclar, gostaria de remover a primeira e a última página de cada documento. Como posso combinar isso com o processo de mesclagem, para que eu não precise executar cada arquivo duas vezes por meio de gs?

Para mesclar, eu uso o comando de this

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

Atualização:

Eu tentei o comando acima (sem remover páginas) em alguns arquivos da vida real, e ele está sendo executado muito lentamente.

gswin32c.exe -dBATCH -dNOPAUSE -o temp.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dColorConve
rsionStrategy=/LeaveColorUnchanged -dEncodeColorImages=false -dEncodeGrayImages=false -dEncodeMonoImages=false [list of pdf files] pdfmark

A execução do comando acima para 20 arquivos de 2MB cria quase 2 GB de arquivos temporários e, em seguida, é executado de forma extremamente lenta com pouca utilização de CPU e muita atividade de HDD. Demora cerca de 20 min, e o arquivo de saída é de 800 MB.

Eu recebo esta mensagem de erro: GPL Ghostscript 9.10: Glifo ausente CID = 0, glifo = 0028 na fonte HiddenHorzOCR. O PDF de saída pode falhar com alguns visualizadores.

Por outro lado, o pdftk é executado em 30s e o arquivo de saída é 40 MB. Adicionar os marcadores com gs leva mais um minuto e torna o arquivo mais lento para 30 MB.

gswin32c.exe -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf pdftk.pdf pdfmark

Existe alguma desvantagem em usar o pdftk? Eu gostaria de preservar as imagens exatamente da mesma qualidade e não perder nenhum detalhe e não tornar os arquivos desnecessariamente grandes. Caso contrário, eu não me importo muito, os pdfs são principalmente artigos científicos escaneados e capítulos de livros. As páginas que eu gostaria de remover são páginas de capa que foram digitalizadas com cada artigo, uma na frente e outra no final.

    
por Dan 29.06.2014 / 19:30

1 resposta

1

Com relação à sua atualização: pdftk preserva as configurações de qualidade de imagem, mas não metadados, marcadores de capítulo, etc.

sejda é um novo kit de ferramentas de edição de pdf que pode fazer tudo o que o pdftk pode e muito mais. Mais importante ainda, ele preserva todas as configurações de qualidade e a maioria dos metadados do arquivo. O Sejda requer que o Java funcione.

Veja a documentação das ações de mesclagem:

$sejda merge -h

Given a collection of pdf documents, creates a single output pdf document composed by the selected pages of each input document taken in the given order.

Example usage: sejda-console merge -f /tmp/file1.pdf /tmp/file2.pdf -o /tmp/output.pdf -s all:12-14:32,12-14,4,34-:

Usage: sejda-console merge options
  [--addBlanks] : add a blank page after each merged document if the number of pages is odd (optional)
  --bookmarks -b value : bookmarks merge policy. {discard, retain, one_entry_each_doc }. Default is 'retain' (optional)
  [--compressed] : compress output file (optional)
  [--copyFields] : input pdf documents contain forms (high memory usage) (optional)
  [--directory -d value] : directory containing pdf files to merge. Files will be merged in alphabetical order. (optional)
  [--files -f value...] : pdf files to operate on: a list of existing pdf files (EX. -f /tmp/file1.pdf or -f /tmp/password_protected_file2.pdf:secret123) (optional)
  [--filesListConfig -l value] : xml or csv file containing pdf files list to concat. If csv file in comma separated value format; if xml file <filelist><file value="filepath" /></filelist> (optional)
  [--help -h] : prints usage information. Can be used to detail options for a command '-h command' (optional)
  [--matchingRegEx -e value] : regular expression the file names have to match when the directory input is used (Ex -e "test(.*).pdf"). (optional)
  --output -o value : output file (required)
  [--overwrite] : overwrite existing output file (optional)
  --pageSelection -s value : page selection script. You can set a subset of pages to merge as a colon separated list of page selections. Order of the pages is relevant. Accepted values: 'all' or 'num1-num2' or 'num-' or 'num1,num2-num3..' 
    (EX. -f /tmp/file1.pdf /tmp/file2.pdf -s all:all:), (EX. -f /tmp/file1.pdf /tmp/file2.pdf /tmp/file3.pdf -s all:12-14:32,12-14,4,34-:) to merge file1.pdf, pages 12,13,14 of file2.pdf and pages 32,12,13,14,4,34,35.. of file3.pdf. 
    If -s is not set default behaviour is to merge document completely (optional)
  --pdfVersion -v value : pdf version of the output document/s {2, 3, 4, 5, 6 or 7}. Default is 6. (optional)

Digamos que você tenha dois arquivos PDF, file1.pdf e file2.pdf, cada um com 50 páginas, e gostaria de mesclá-los, deixando de fora a primeira e a última página em cada caso. Este comando deve fazer o truque:

sejda-console merge -f file1.pdf file2.pdf -o merge.pdf -s 2-49:2-49:

Observação: você pode ter que substituir sejda-console por sejda-console.bat se estiver no Windows.

Como você pode ver, ainda teria que fornecer manualmente o intervalo de páginas para cada documento. Se você quiser automatizar isso, você pode escrever um script bash ou algo semelhante para calcular primeiro a contagem de páginas em PDF (por exemplo, usando pdfinfo da libpoppler) e então compor a linha de comando sejda de acordo.

    
por 30.06.2014 / 14:25