Como faço para 'unbook' a pdf

10

Eu tenho um arquivo PDF que foi feito em um formato de livreto. Destina-se a imprimir em papel A4 na orientação paisagem; aqui estão duas páginas no pdf, que devem corresponder a quatro páginas no livro atual.

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

Os números entre parênteses correspondem à ordem das páginas individuais.

Eu sei que existem todos os tipos de comandos (pdfbook, pdfnup, etc.) no linux (que provavelmente foi usado para fazer este livreto em primeiro lugar). Como faço para 'unbook' - isto é, eu gostaria de fazer um documento em PDF a partir deste, onde cada página individual do produto final é uma página individual do pdf, ordenada da maneira usual.

Editar

Graças a Gilles, consegui usar o seguinte código:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    print >> sys.stderr, 'splitting page',i
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2)
    p.mediaBox.lowerLeft = bl

    q.mediaBox.upperRight = ur
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2)

    if i % 2 == 0:
        output.addPage(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)
    
por TSGM 20.01.2012 / 23:04

1 resposta

4

Aqui está um pequeno script Python usando a biblioteca PyPdf que faz o trabalho. (Derivado de un2up .) Salve em um script chamado unbook , torne-o executável ( chmod +x unbook ) e execute-o como um filtro ( unbook <book.pdf >1up.pdf ).

Eu testei esse script na saída de pdfbook --signature=N . Para outro método, talvez você não precise reverter todas as outras páginas de entrada, e a ordem das páginas pode ser diferente (depende da orientação das páginas de paisagem). A disposição da página não corresponde à sua pergunta; o 13,42 não faz sentido para mim (em um livro de 4 páginas, 3 deve estar ao lado de 2, não próximo de 1).

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)

Ignore qualquer aviso de descontinuação; apenas os mantenedores do PyPdf precisam se preocupar com isso.

    
por 22.01.2012 / 23:20