
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 pdftk
da 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.txt
o 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:
O exemplo acima pressupõe que todas as páginas tenham o mesmo tamanho. O
doc_data.txt
arquivo contém o tamanho de cada página dividida. Se o comandogrep 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.
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 pdftk
como 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.txt
pode 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:
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 pstops
do 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 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 R
para 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
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