Como eu posso embaralhar as páginas de um arquivo pdf em uma ordem aleatória?

3

Gostaria de embaralhar as páginas de um documento em PDF em uma ordem aleatória.

Como isso pode ser feito?

    
por danjjl 14.06.2015 / 22:52

4 respostas

3

Com pdftk e GNU coreutils

Determine o número de páginas no arquivo PDF e, em seguida, chame shuf para gerar uma lista aleatória de números de páginas e chamar pdftk novamente para extrair a sequência de páginas fornecida.

pdftk original.pdf cat $(shuf 1-$(pdftk original.pdf dump_data | awk '$1=="NumberOfPages:" {print $2}')) output randomized.pdf

Com Python e PyPdf

#!/usr/bin/env python2
import random, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
pages = range(input.getNumPages())
random.shuffle(pages)
for i in pages:
     output.addPage(input.getPage(i))
output.write(sys.stdout)'

Uso: /path/to/script <original.pdf >randomized.pdf

    
por 14.06.2015 / 23:48
3

Usaremos pdftk para executar operações no documento em PDF.

  1. Crie um diretório de trabalho temporário:

    mkdir tmp
    
  2. Divida o documento em PDF em muitos documentos de uma página:

    pdftk original.pdf burst output tmp/pg_%02d.pdf
    
  3. Renomeie o documento de uma página com nomes aleatórios:

    for name in tmp/*.pdf; do
       mv "tmp/$name" tmp/$(echo "$name" | sha1sum | cut -f1 -d' ').pdf
    done
    
  4. Mesclar todos os documentos de uma página:

    pdftk tmp/*.pdf cat output random.pdf
    
  5. Limpe o diretório de trabalho temporário:

    rm -r tmp
    
por 14.06.2015 / 22:52
2

um pouco de melhoria para a resposta de Gilles:

pdftk original.pdf cat $(shuf --input-range=1-$(pdftk original.pdf dump_data | awk '$1=="NumberOfPages:" {print $2}')) output randomized.pdf
    
por 14.02.2016 / 11:53
0

Há também uma versão usando pdfjoin / pdfjam (como aqui ), misturando a sequência de números de página e usando isso como entrada para pdfjoin:

# $1: source pdf file
# $2: last page number to consider
# $3: name of output file

for k in $(seq 1 $2 | shuf); do
    PAGES+=($1);
    PAGES+=($k);
done

pdfjoin ${PAGES[@]} --outfile $3
    
por 25.04.2018 / 14:12