Вот небольшой скрипт Python, использующий библиотеку PyPdf, которая делает работу аккуратно. Сохраните его в скрипте с именем un2up
(или как хотите), сделайте его исполняемым ( chmod +x un2up
) и запустите его как фильтр ( 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)
Игнорировать любые предупреждения об устаревании; только сопровождающие PyPdf должны быть обеспокоены этим.
Если входные данные ориентированы необычным образом, вам может понадобиться использовать разные координаты при усечении страниц. См. Почему мой код неправильно разделяет каждую страницу в отсканированном PDF?
На всякий случай, если это полезно, вот мой предыдущий ответ, в котором используется комбинация двух инструментов плюс некоторое ручное вмешательство:
- Pdfjam (по крайней мере версия 2.0) на основе пакета pdfpages LaTeX для обрезки страниц;
- Pdftk , чтобы собрать левую и правую половинки вместе.
Оба инструмента необходимы, потому что, насколько я могу судить, pdfpages не может применить два разных преобразования к одной и той же странице в одном потоке. В вызове pdftk
замените 42 числом страниц во входном документе ( 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
Если у вас нет pdfjam 2.0, достаточно установить PDFLaTeX с пакетом pdfpages (в Ubuntu: вам нужны texlive-latex-рекомендуемые и, возможно, (в Ubuntu: texlive-fonts-рекомендуемые ), и использовать следующий драйвер файл 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}
Затем выполните следующие команды, заменив 42 на количество страниц во входном файле (который должен быть вызван 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