Aqui está um pequeno script Python usando a biblioteca PyPdf que faz o trabalho perfeitamente. Salve-o em um script chamado un2up
(ou o que você quiser), torne-o executável ( chmod +x un2up
) e execute-o como um 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)
Ignore todos os avisos de descontinuação; somente os mantenedores do PyPdf precisam se preocupar com isso.
Se a entrada for orientada de maneira incomum, talvez seja necessário usar coordenadas diferentes ao truncar as páginas. Consulte Por que meu código não divide corretamente todas as páginas em um pdf digitalizado?
Para o caso de ser útil, aqui está minha resposta anterior, que usa uma combinação de duas ferramentas mais alguma intervenção manual:
- Pdfjam (pelo menos versão 2.0), baseado no pacote LaTeX das páginas pdf , para cortar as páginas;
- Pdftk , para juntar as metades esquerda e direita.
Ambas as ferramentas são necessárias porque, até onde sei, as páginas em pdf não conseguem aplicar duas transformações diferentes à mesma página em um fluxo. Na chamada para pdftk
, substitua 42 pelo número de páginas no documento de entrada ( 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
Caso você não possua o pdfjam 2.0, basta instalar o PDFLaTeX com o pacote pdfpages (no Ubuntu: você precisa do texlive-latex-recommended e talvez (no Ubuntu: texlive-fonts-recommended ) e use o seguinte driver arquivo 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}
Em seguida, execute os seguintes comandos, substituindo 42 pelo número de páginas no arquivo de entrada (que deve ser chamado 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