Como posso dividir cada página PDF em duas páginas usando a linha de comando?

Como posso dividir cada página PDF em duas páginas usando a linha de comando?

Tenho alguns e-books digitalizados de originais. Eles são formatados para que um únicoPágina PDFcontém doispáginas reais: um à esquerda e outro à direita.

Quero dividir programaticamente cada página do PDF em duas, de modo que 50% da esquerda da página 1 do PDF se torne a página 1 e a direita se torne a página 2, e assim por diante para todas as páginas.

Alguém conhece um utilitário ou script de linha de comando que possa ajudar com isso?


Saída de pdfimages -list -f 1 -l 1 file.pdf:

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    1921  1561  rgb     3   8  jpeg   no       643  0   200   200  200K 2.3%
   1     1 stencil     1     1  -       1   1  image  no   [inline]   0.692     2    -    - 
   1     2 stencil     1     1  -       1   1  image  no   [inline]   0.722 0.650    -    - 
   1     3 stencil     1     1  -       1   1  image  no   [inline]       3     3    -    - 

Segundo PDF:

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image     456   625  gray    1   8  jpx    yes      251  0    72    72 11.7K 4.2%

Responder1

Isso deve funcionar, precisa pdftkda ferramenta (e ghostscript).

Um caso simples:

Passo um:Dividir em páginas individuais

 pdftk clpdf.pdf burst

isso produz arquivos pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf, um para cada página. Também produz doc_data.txto que contém dimensões de página.

Passo dois:Crie meias páginas esquerda e direita

  pw=`cat doc_data.txt  | grep PageMediaDimensions | head -1 | awk '{print $2}'`
  ph=`cat doc_data.txt  | grep PageMediaDimensions | head -1 | awk '{print $3}'`
  w2=$(( pw / 2 ))
  w2px=$(( w2*10 ))
  hpx=$((  ph*10 ))
  for f in  pg_[0-9]*.pdf ; do
   lf=left_$f
   rf=right_$f
   gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
   gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${w2} 0]>> setpagedevice" -f ${f}
  done

Passo três:Mesclar esquerda e direita para produzir newfile.pdf.pdf de página única.

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

Um caso mais geral:

  1. O exemplo acima pressupõe que todas as páginas tenham o mesmo tamanho. O doc_data.txtarquivo contém o tamanho de cada página dividida. Se o comando

    grep PageMediaDimensions <doc_data.txt | sort | uniq | wc -l

    não retorna 1, então as páginas têm dimensões diferentes e alguma lógica extra é necessária emPasso dois.

  2. Se a divisão não for exatamente 50:50, w2=$(( pw / 2 ))será necessária uma fórmula melhor que a usada no exemplo acima.

Este segundo exemplo mostra como lidar com este caso mais geral.

Passo um:dividir com pdftkcomo antes

Passo dois:Agora crie três arquivos que contenham a largura e a altura de cada página e um padrão para a fração da divisão que a página esquerda usará.

  grep PageMediaDimensions <doc_data.txt | awk '{print $2}'    >   pws.txt
  grep PageMediaDimensions <doc_data.txt | awk '{print $3}'    > phs.txt
  grep PageMediaDimensions <doc_data.txt | awk '{print "0.5"}' > lfrac.txt

o arquivo lfrac.txtpode ser editado manualmente se houver informações disponíveis sobre onde dividir as diferentes páginas.

Passo três:Agora crie páginas divididas à esquerda e à direita, usando diferentes tamanhos de página e (se editado) diferentes locais fracionários para a divisão.

#!/bin/bash
exec 3<pws.txt
exec 4<phs.txt
exec 5<lfrac.txt

for f in  pg_[0-9]*.pdf ; do
 read <&3 pwloc
 read <&4 phloc
 read <&5 lfr
 wl=`echo "($lfr)"'*'"$pwloc" | bc -l`;wl=`printf "%0.f" $wl`
 wr=$(( pwloc - wl ))
 lf=left_$f
 rf=right_$f
 hpx=$((  phloc*10 ))
 w2px=$(( wl*10 ))
 gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
 w2px=$(( wr*10 ))
 gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${wl} 0]>> setpagedevice" -f ${f}
done

Etapa quatro:Esta é a mesma etapa de mesclagem do exemplo anterior, mais simples.

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

Responder2

Você pode ampliar sua escolha de ferramentas convertendo o pdf em PostScript da seguinte maneira e, em seguida, usandopstops. Presumi que começamos com uma página A4 de retrato mostrando duas páginas como se elas pudessem ter sido digitalizadas de um livro aberto, com a lombada passando horizontalmente pelo meio, assim:

original

Obviamente, você pode alterar os valores na solução abaixo para se adequar ao seu caso específico.

Você pode converter este pdf para PostScript com pdf2ps(que faz parte do pacote ghostscript). Em seguida, a ferramenta pstopsdo pacote psutils pode ser usada para girar a página para a direita (sentido horário) em torno do canto inferior esquerdo, redimensioná-la e mover o resultado para cima de modo que apenas a metade inferior cubra uma página inteira:

uma página

Uma segunda página pode ser criada a partir da mesma página original por meio de rotação, escala e tradução semelhantes. O resultado pode ser convertido novamente para PDF. Um único comando pode desenhar cada página em 2 novas páginas:

pdf2ps myfile.pdf out.ps
pstops -p a4 '[email protected](1cm,29cm),[email protected](-16cm,29cm)' out.ps new.ps
ps2pdf new.ps new.pdf

A sintaxe é explicada na página de manual. Aqui temos Rpara girar para a direita, @1,2 para dimensionar, (x,y) para mover o resultado. A vírgula (,) produz 2 páginas de cada página original.

Observe que isso dobrará o tamanho do PDF resultante, já que cada página é totalmente desenhada duas vezes, mesmo que você veja apenas metade dela de cada vez.

Responder3

Você pede especificamente uma solução para a linha de comando - provavelmente porque não deseja sentar e selecionar cada página.

Mas se for aceitável abrir todos os livros, então pdfarrangerfuncionará.

Não dobrará o tamanho do arquivo PDF.

Antes de dividir Depois de dividir

Responder4

Você pode querer dar uma olhada em imagemagick:

$ convert -resize 1000x1000 /links/www/Salix/pdf/index.pdf a.jpg
$ convert -crop 500x1000+0+0  a.jpg b.jpg
$ convert -crop 500x1000+500+0 a.jpg c.jpg
$ convert c.jpg c.pdf
$ convert b.jpg b.pdf

informação relacionada