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

4

Eu tenho alguns e-books digitalizados de originais. Eles estão formatados para que uma única página PDF contenha duas páginas reais : uma à esquerda e outra à direita.

Eu quero dividir programaticamente cada página do PDF em dois, de forma que os 50% restantes da página 1 do PDF se tornem a página 1 e seu direito se torne a página 2, e assim por diante para todas as páginas.

Alguém sabe de um utilitário de linha de comando ou script que poderia 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%
    
por Philip Kirkbride 19.11.2017 / 16:06

6 respostas

5

Isso deve funcionar e precisa de pdftk tool (e ghostscript ).

Um caso simples:

Primeiro passo: dividido 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 , que contém dimensões de página.

Segundo passo: Crie meia página à 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

Etapa três: mesclar para a esquerda e para a direita para produzir newfile.pdf contendo uma única página .pdf.

  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 supõe que todas as páginas são do mesmo tamanho. O arquivo doc_data.txt contém tamanho para cada página dividida. Se o comando

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

    não retorna 1, as páginas têm dimensões diferentes e algumas lógica extra é necessária no Passo Dois .

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

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

Primeiro passo: dividido 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 a informação estiver disponível para onde dividir páginas diferentes.

Etapa três: Agora crie páginas divididas à esquerda e à direita, usando os diferentes tamanhos de página e (se editados) 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

Quarto passo: Este é o mesmo passo 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 
    
por 26.11.2017 / 20:25
4

Você pode ampliar sua opção de ferramentas convertendo o pdf para PostScript da seguinte maneira, usando pstops . Presumi que partimos de uma página de retratos A4 mostrando duas páginas, já que elas poderiam ter sido escaneadas de um livro aberto, com a lombada indo horizontalmente pelo meio, assim:

Obviamente,vocêpodealterarosvaloresnasoluçãoabaixoparaseadequaraoseucasoexato.

VocêpodeconverterestepdfparaPostScriptcompdf2ps(quefazpartedopacoteghostscript).Entãoaferramentapstopsdopacotepsutils,podeserusadaparagirarapáginaparaadireita(nosentidohorário)nocantoinferioresquerdo,redimensioná-laemoveroresultadoparaquesomenteametadeinferiorcubraumapáginainteira:

Uma segunda página pode ser criada a partir da mesma página original por uma rotação, escala e tradução semelhantes. O resultado pode ser convertido de volta para o pdf. Um único comando pode desenhar cada página em duas 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 man. Aqui temos R para rodar para a direita, @ 1.2 para escalar, (x, y) para mover o resultado. A vírgula (,) produz 2 páginas de cada página original.

Observe que isso duplicará o tamanho do pdf resultante, já que cada página é totalmente desenhada duas vezes, mesmo que você só veja metade dela a cada vez.

    
por 19.11.2017 / 20:41
3

Você deseja Libpoppler ou, mais precisamente, a ferramenta pdfimages . É software livre, irá extrair as imagens do PDF. Se o PDF contiver imagens digitalizadas, elas nem sempre serão orientadas corretamente, em alguns graus. Se a página contiver duas imagens, uma para cada página escaneada, ficará fácil ... se não, você terá que cortá-las manualmente (sujo) ou tentar usar o ImageMagick para dividi-las.

link

link

Extraído de stackoverflow .

    
por 19.11.2017 / 19:47
2

Você pode querer olhar para 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
    
por 25.11.2017 / 17:43
1

Eu sugiro PDFjam e seu script-filha PDFjoin. Primeiro, corte o lado esquerdo e salve como left.pdf e, em seguida, corte o lado direito e salve como right.pdf e mescle as páginas individuais dos dois arquivos. Você pode ler os exemplos na página para inspiração. Se isso for muito fácil para você, você poderá seguir a rota do Ghostscript, mas terá que fazer um pouco de matemática de pixel, contagem de páginas externas e um concat final etc.

Não vá pela rota do jpg - você terá uma incrível geração de arquivos e artefatos.

    
por 26.11.2017 / 03:16
0

O PDFcreator tem um plug-in com o qual você pode se comunicar. Mas você precisa da edição "plus", que custa US $ 10 por ano.

    
por 19.11.2017 / 18:35