¿Cómo puedo 'des-reservar' un pdf?

10

Tengo un archivo pdf que se convirtió en un formato de folleto. Está destinado a imprimir en papel A4 en orientación horizontal; Aquí hay dos páginas en el pdf, que deben corresponder a cuatro páginas en el libro real.

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

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

Los números entre corchetes corresponden al orden de las páginas individuales.

Sé que hay todo tipo de comandos (pdfbook, pdfnup, etc.) en Linux (que probablemente se usó para hacer este folleto en primer lugar). ¿Cómo puedo 'deshacerlo'? Es decir, me gustaría hacer un documento en PDF a partir de esto, donde cada página individual del producto final es una página individual del pdf, ordenada de la manera habitual.

Editar

Gracias a Gilles, logré usar el siguiente 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)
TSGM
fuente
1
Creo que esto debería ir a superuser.com
Adam Zalcman
@AdamZalcman ¿Por qué? Está buscando un programa de Linux
Michael Mrozek
2
Puede adaptar esta respuesta a las preguntas (por Gilles) a su problema , es decir, crear un script PyPdf.
sr_
¿Estás seguro de que no has intercambiado las páginas 3 y 4? He trabajado en imprenta; ese diseño no tiene ningún sentido ...
Wildcard

Respuestas:

4

Aquí hay un pequeño script de Python que usa la biblioteca PyPdf que hace el trabajo. (Derivado de un2up.) Guárdelo en un script llamado unbook, hágalo ejecutable ( chmod +x unbook) y ejecútelo como filtro ( unbook <book.pdf >1up.pdf).

Probé este script en la salida de pdfbook --signature=N. Para otro método, es posible que no necesite invertir todas las demás páginas de entrada, y el orden de las páginas puede ser diferente (depende de la orientación de las páginas horizontales). La disposición de la página no coincide con su pregunta; el 13,42 no tiene sentido para mí (en un libro de 4 páginas, 3 debería estar al lado del 2, no al lado del 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)

Ignorar cualquier advertencia de desaprobación; solo los mantenedores de PyPdf deben preocuparse por esto.

Gilles 'SO- deja de ser malvado'
fuente
Esto se preguntó hace algún tiempo, pero tengo problemas para implementar su solución. Estoy ejecutando OSX, he instalado python y py27-pypdf a través de MacPorts. Creé un archivo sin libro y copié y pegué el guión. Ejecutar el comando según las instrucciones crea un nuevo archivo 1up.pdf con 0 bytes. No aparece ningún error ni nada en mi terminal, pero al ejecutar el comando, no sucede nada (tengo que sacar CTRL-C); el sistema no se bloquea y no parece estar haciendo nada. ¿Cómo puedo localizar el problema? @Gilles
TSGM
@TSGM La explicación más probable es que se olvidó <antes del archivo de entrada. Si está realmente seguro de que escribió el comando correctamente, podría ser un error en la biblioteca PyPdf (todavía no me ha fallado, pero podría suceder).
Gilles 'SO- deja de ser malvado'
El problema era que se suponía que debía llamar a python a través de "python unbook <in.pdf> out.pdf". Tonto de mí. Además, su código era un poco extraño (estaba pegando las páginas de la segunda mitad al final. Parece que lo he corregido para el formato que escribí en la publicación original). He editado mi respuesta original para contener el código que finalmente utilicé. Además, los comandos de tamaño de página parecen estar equivocados. Corregí eso también. @Gilles
TSGM
@TSGM El código asume un diseño de 1 | 4 anverso, 2 | 3 reverso, que es el diseño habitual del libro. Es posible que deba ajustarlo si sus páginas se distribuyen de manera diferente. Fue probado en campo en ese entorno. Tuvo que llamar explícitamente pythonfue mi error: debería haber puesto una línea shebang, agregada.
Gilles 'SO- deja de ser malvado'