Ecco un piccolo script Python che utilizza la libreria PyPdf che svolge il lavoro in modo ordinato. Salvalo in uno script chiamato un2up
(o come preferisci), rendilo eseguibile ( chmod +x un2up
) ed eseguilo come filtro ( un2up <2up.pdf >1up.pdf
).
#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
for p in [input.getPage(i) for i in range(0,input.getNumPages())]:
q = copy.copy(p)
(w, h) = p.mediaBox.upperRight
p.mediaBox.upperRight = (w/2, h)
q.mediaBox.upperLeft = (w/2, h)
output.addPage(p)
output.addPage(q)
output.write(sys.stdout)
Ignora eventuali avvisi di ammortamento; solo i manutentori di PyPdf devono preoccuparsene.
Se l'input è orientato in modo insolito, potrebbe essere necessario utilizzare coordinate diverse quando si troncano le pagine. Vedi Perché il mio codice non ha suddiviso correttamente ogni pagina in un PDF scansionato?
Nel caso sia utile, ecco la mia risposta precedente che utilizza una combinazione di due strumenti più un intervento manuale:
- Pdfjam (almeno versione 2.0), basato sul pacchetto LaTeX di pdfpages , per ritagliare le pagine;
- Pdftk , per rimettere insieme le metà sinistra e destra.
Entrambi gli strumenti sono necessari perché, per quanto ne so, pdfpages non è in grado di applicare due diverse trasformazioni alla stessa pagina in un flusso. Nella chiamata a pdftk
, sostituire 42 con il numero di pagine nel documento di input ( 2up.pdf
).
pdfjam -o odd.pdf --trim '0cm 0cm 14.85cm 0cm' --scale 1.141 2up.pdf
pdfjam -o even.pdf --trim '14.85cm 0cm 0cm 0cm' --scale 1.141 2up.pdf
pdftk O=odd.pdf E=even.pdf cat $(i=1; while [ $i -le 42 ]; do echo O$i E$i; i=$(($i+1)); done) output all.pdf
Se non hai pdfjam 2.0, è sufficiente avere un'installazione PDFLaTeX con il pacchetto pdfpages (su Ubuntu: hai bisogno di texlive-latex-consigliati e forse (su Ubuntu: texlive-fonts-raccomandato ), e usa il seguente driver file driver.tex
:
\batchmode
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdfmerge[trim=0cm 0cm 14.85cm 0cm,scale=1.141]{2up.pdf,-}
\includepdfmerge[trim=14.85cm 0cm 0cm 0cm,scale=1.141]{2up.pdf,-}
\end{document}
Quindi eseguire i seguenti comandi, sostituendo 42 con il numero di pagine nel file di input (che deve essere chiamato 2up.pdf
):
pdflatex driver
pdftk driver.pdf cat $(i=1; pages=42; while [ $i -le $pages ]; do echo $i $(($pages+$i)); i=$(($i+1)); done) output 1up.pdf