¿Cómo puedo dividir cada página PDF en dos páginas usando la línea de comando?

¿Cómo puedo dividir cada página PDF en dos páginas usando la línea de comando?

Tengo algunos libros electrónicos escaneados a partir de originales. Están formateados para que un solopágina PDFcontiene dospáginas reales: uno a la izquierda y otro a la derecha.

Quiero dividir mediante programación cada página PDF en dos, de modo que el 50% izquierdo de la página 1 del PDF se convierta en la página 1 y el lado derecho se convierta en la página 2, y así sucesivamente para todas las páginas.

¿Alguien conoce alguna utilidad de línea de comandos o script que pueda ayudar con esto?


Salida 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%

Respuesta1

Esto debería funcionar, necesita pdftkherramienta (y ghostscript).

Un caso sencillo:

Paso uno:Dividir en páginas individuales

 pdftk clpdf.pdf burst

esto produce archivos pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf, uno para cada página. También produce doc_data.txtque contiene dimensiones de página.

Segundo paso:Crear medias páginas izquierda y derecha

  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

Paso tres:Fusione izquierda y derecha para producir newfile.pdfun .pdf que contenga una sola página.

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

Un caso más general:

  1. El ejemplo anterior supone que todas las páginas tienen el mismo tamaño. El doc_data.txtarchivo contiene el tamaño de cada página dividida. Si el comando

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

    no devuelve 1, entonces las páginas tienen dimensiones diferentes y se necesita algo de lógica adicional enSegundo paso.

  2. Si la división no es exactamente 50:50, entonces w2=$(( pw / 2 ))se necesita una fórmula mejor que la utilizada en el ejemplo anterior.

Este segundo ejemplo muestra cómo manejar este caso más general.

Paso uno:dividir con pdftkcomo antes

Segundo paso:Ahora cree tres archivos que contengan el ancho y el alto de cada página y un valor predeterminado para la fracción de división que usará la página izquierda.

  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

El archivo lfrac.txtse puede editar manualmente si hay información disponible sobre dónde dividir las diferentes páginas.

Paso tres:Ahora cree páginas divididas hacia la izquierda y hacia la derecha, utilizando los diferentes tamaños de página y (si se editan) diferentes ubicaciones fraccionarias para la división.

#!/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

Paso cuatro:Este es el mismo paso de fusión que en el ejemplo anterior, más simple.

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

Respuesta2

Puede ampliar su elección de herramientas convirtiendo el pdf a PostScript de la siguiente manera y luego usandoparadas. Supuse que comenzamos con una página vertical A4 que muestra dos páginas como si hubieran sido escaneadas de un libro abierto, con el lomo horizontal en el medio, así:

original

Obviamente, puede cambiar los valores en la solución siguiente para que se ajusten a su caso concreto.

Puede convertir este pdf a PostScript con pdf2ps(que forma parte del paquete GhostScript). Luego pstops, la herramienta del paquete psutils se puede usar para rotar la página hacia la derecha (en el sentido de las agujas del reloj) alrededor de la esquina inferior izquierda, cambiar su escala y mover el resultado hacia arriba para que solo la mitad inferior cubra toda la página:

una página

Se puede crear una segunda página a partir de la misma página original mediante una rotación, escala y traducción similares. El resultado se puede volver a convertir a pdf. Un solo comando puede dibujar cada página en 2 páginas nuevas:

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

La sintaxis se explica en la página de manual. Aquí tenemos Rpara rotar a la derecha, @1.2 para escalar, (x,y) para mover el resultado. La coma (,) genera 2 páginas de cada página original.

Tenga en cuenta que esto duplicará el tamaño del pdf resultante, ya que cada página se dibuja completamente dos veces, aunque solo vea la mitad cada vez.

Respuesta3

Solicita específicamente una solución para la línea de comando, probablemente porque no quiere sentarse y seleccionar cada página.

Pero si es aceptable abrir todos los libros, entonces pdfarrangerfuncionará.

No duplicará el tamaño del archivo PDF.

antes de dividir Después de dividir

Respuesta4

Quizás quieras mirar 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

información relacionada