
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 pdftk
herramienta (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.txt
que 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.pdf
un .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:
El ejemplo anterior supone que todas las páginas tienen el mismo tamaño. El
doc_data.txt
archivo contiene el tamaño de cada página dividida. Si el comandogrep 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.
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 pdftk
como 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.txt
se 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í:
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:
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 R
para 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
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