Oto mały skrypt Pythona korzystający z biblioteki PyPdf, która dobrze wykonuje to zadanie. Zapisz go w skrypcie o nazwie un2up
(lub cokolwiek chcesz), spraw, aby był wykonywalny ( chmod +x un2up
) i uruchom go jako filter ( 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)
Zignoruj wszelkie ostrzeżenia o wycofaniu; tylko opiekunowie PyPdf muszą się tym zajmować.
Jeśli dane wejściowe są zorientowane w nietypowy sposób, może być konieczne użycie różnych współrzędnych podczas obcinania stron. Zobacz Dlaczego mój kod nie podzielił poprawnie każdej strony na zeskanowanym pliku pdf?
Na wszelki wypadek przydatna jest moja wcześniejsza odpowiedź, która wykorzystuje kombinację dwóch narzędzi plus pewną ręczną interwencję:
- Pdfjam (przynajmniej wersja 2.0), oparty na pakiecie LaTeX pdfpages , do przycinania stron;
- Pdftk , aby ponownie połączyć lewą i prawą połówkę.
Oba narzędzia są potrzebne, ponieważ o ile wiem, strony pdf nie są w stanie zastosować dwóch różnych transformacji do tej samej strony w jednym strumieniu. W wywołaniu do pdftk
zamień 42 na liczbę stron w dokumencie wejściowym ( 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
Jeśli nie masz pdfjam 2.0, wystarczy mieć instalację PDFLaTeX z pakietem pdfpages (na Ubuntu: potrzebujesz texlive-latex-zalecany i być może (na Ubuntu: texlive-fonts-zalecany ), i użyj następującego sterownika plik 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}
Następnie uruchom następujące polecenia, zastępując 42 liczbą stron w pliku wejściowym (które należy wywołać 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