Dividir PDF em documentos com várias páginas cada

7

Existem vários recursos na Web que explicam como se pode dividir um PDF em vários arquivos na página por arquivo.

Mas como você pode dividi-los em blocos de, digamos, cinco páginas cada? Eu olhei para as ferramentas padrão, como pdftk , mas não consegui encontrar uma opção fazendo o que eu quero.

    
por Raphael 05.03.2013 / 15:25

4 respostas

12

pdftk é capaz de cortar eficientemente um conjunto fixo de páginas. Com um pouco de cola de script, isso faz o que eu quero:

number=$(pdfinfo -- "$file" 2> /dev/null | awk '$1 == "Pages:" {print $2}')
count=$((number / pagesper))
filename=${file%.pdf}

counter=0
while [ "$count" -gt "$counter" ]; do 
  start=$((counter*pagesper + 1));
  end=$((start + pagesper - 1));

  counterstring=$(printf %04d "$counter")
  pdftk "$file" cat "${start}-${end}" output "${filename}_${counterstring}.pdf"

  counter=$((counter + 1))
done

Isso pressupõe que você tenha o número de páginas por fragmento em $pagesper e o nome do arquivo PDF de origem em $file .

Se você tiver acroread instalado, também poderá usar

acroread -size a4 -start "$start" -end "$end" -pairs "$file" "${filename}_${counterstring}.ps"

acroread oferece a opção -toPostScript , que pode ser útil.

    
por 05.03.2013 / 15:25
8

Veja também pdfseparate e pdfunite de poppler-utils . pdfseparate divide o arquivo em um arquivo por página, o que torna relativamente fácil remontar à vontade mais tarde com pdfunite , manualmente ou (semi-) automaticamente.

Como com o zsh:

autoload zargs

reunite() pdfunite "$@" file-$1-$argv[-1].pdf

pdfseparate file.pdf p%d
zargs -n 5 p<->(n) -- reunite
rm -f p<->

dividiria file.pdf em file-p1-p5.pdf , file-p6-p10.pdf ...

    
por 05.03.2013 / 20:56
3

Eu acho o Python com a biblioteca PyPdf conveniente para os trabalhos que o pdftk não faz convenientemente (ou nada).

#!/usr/bin/env python
import sys
from pyPdf import PdfFileWriter, PdfFileReader

# Command line parsing
if len(sys.argv) < 2 or sys.argv[1][-4:] != '.pdf':
    sys.stderr.writeln('Usage: ' + sys.argv[0] + ''' FILE.pdf N
Split FILE.pdf into chunks of N pages each.''')
    exit(3)
pages_per_file = int(sys.argv[2])

base_name = sys.argv[1][:-4] + '-'
input_pdf = PdfFileReader(open(sys.argv[1]))
output_pdf = PdfFileWriter()
num_pages = input_pdf.getNumPages()
for i in xrange(num_pages):
    output_pdf.addPage(input_pdf.getPage(i))
    if (i + 1) % pages_per_file == 0 or i + 1 == num_pages:
        output_file = open(base_name + str(i / pages_per_file + 1) + '.pdf', "wb")
        output_pdf.write(output_file)
        output_file.close()
        output_pdf = PdfFileWriter()
    
por 06.03.2013 / 00:51
1

A solução postada por Raphael é falha: se você tem um número ímpar de páginas, as últimas são ignoradas. Existe uma solução aprimorada que funciona também com um número ímpar de páginas. Novamente, presume-se que você tenha o número de páginas por fragmento em $pagesper e o nome do arquivo PDF de origem em $file .

number=$(pdfinfo -- "$file" 2> /dev/null | awk '$1 == "Pages:" {print $2}')

count=$((($number+$pagesper-1)/$pagesper))
filename=${file%.pdf}

counter=0
while [ "$count" -gt "$counter" ]; do
  start=$((counter*pagesper + 1));
  end=$((start + pagesper - 1));
  if [ $end -gt $number ]; then
    end=$number
  fi

  counterstring=$(printf %04d "$counter")
  pdftk "$file" cat "${start}-${end}" output "${filename}_${counterstring}.pdf"
  counter=$((counter + 1))
done
    
por 04.07.2014 / 12:42