Come posso "annullare la prenotazione" di un pdf


10

Ho un file pdf che è stato trasformato in un opuscolo. È pensato per stampare su carta A4 con orientamento orizzontale; qui ci sono due pagine nel pdf, che dovrebbero corrispondere a quattro pagine nel libro reale.

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

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

I numeri tra parentesi corrispondono all'ordine delle singole pagine.

So che ci sono tutti i tipi di comandi (pdfbook, pdfnup, ecc.) Su Linux (che è stato probabilmente usato per creare questo opuscolo in primo luogo). Come posso "annullare la prenotazione" --- cioè, vorrei fare un documento pdf da questo in cui ogni singola pagina del prodotto finale è una singola pagina del pdf, ordinata nel solito modo.

modificare

Grazie a Gilles, sono riuscito a utilizzare il seguente codice:

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)

1
Penso che questo dovrebbe andare su superuser.com
Adam Zalcman,

@AdamZalcman Why? Sta cercando un programma Linux
Michael Mrozek


Sei sicuro di non aver scambiato le pagine 3 e 4? Ho lavorato nella stampa; quel layout non ha alcun senso ....
Wildcard

Risposte:


4

Ecco un piccolo script Python che utilizza la libreria PyPdf che fa il lavoro. (Derivato da un2up.) Salvalo in uno script chiamato unbook, rendilo eseguibile ( chmod +x unbook) ed eseguilo come filtro ( unbook <book.pdf >1up.pdf).

Ho testato questo script sull'output di pdfbook --signature=N. Per un altro metodo, potrebbe non essere necessario invertire tutte le altre pagine di input e l'ordine delle pagine potrebbe essere diverso (dipende dall'orientamento delle pagine orizzontali). La disposizione della pagina non corrisponde alla tua domanda; il 13,42 non ha senso per me (in un libro di 4 pagine, 3 dovrebbe essere vicino a 2, non accanto a 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)

Ignora qualsiasi avviso di deprecazione; solo i manutentori di PyPdf devono preoccuparsene.


Questo è stato chiesto qualche tempo fa, ma sto riscontrando problemi nell'implementazione della tua soluzione. Sto eseguendo OSX, ho installato Python e py27-pypdf tramite MacPorts. Ho creato un file unbook e copiato e incollato lo script. L'esecuzione del comando come indicato crea un nuovo file 1up.pdf con 0 byte. Nessun errore o qualcosa è elencato nel mio terminale, ma quando eseguo il comando, non succede nulla (devo uscire CTRL-C); il sistema non si blocca e non sembra fare nulla. Come posso rintracciare il problema? @Gilles
TSGM

@TSGM La spiegazione più probabile è che hai dimenticato il <file di input precedente. Se sei davvero assolutamente sicuro di aver scritto correttamente il comando, potrebbe trattarsi di un bug nella libreria PyPdf (non mi ha ancora deluso, ma potrebbe accadere).
Gilles 'SO- smetti di essere malvagio' il

Il problema era che dovevo chiamare python tramite "unbook python <in.pdf> out.pdf". Sciocco me Inoltre, il tuo codice era un po 'strano (stava attaccando le pagine second_half alla fine. Mi sembra di averlo corretto per il formato che ho scritto nel post originale). Ho modificato la mia risposta originale per contenere il codice che alla fine ho usato. Inoltre, i comandi relativi alle dimensioni della pagina sembrano essere errati. Ho corretto anche quello. @Gilles
TSGM

@TSGM Il codice assume un layout di 1 | 4 dritto, 2 | 3 rovescio, che è il solito layout del libro. Potrebbe essere necessario modificarlo se le tue pagine sono disposte in modo diverso. È stato testato sul campo in quell'impostazione. La tua chiamata esplicita è pythonstata un mio errore: avrei dovuto mettere una linea shebang, ha aggiunto.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.