Đây là một tập lệnh Python nhỏ sử dụng thư viện PyPdf thực hiện công việc một cách gọn gàng. Lưu nó trong một tập lệnh được gọi là un2up
(hoặc bất cứ điều gì bạn thích), làm cho nó có thể thực thi được ( chmod +x un2up
) và chạy nó dưới dạng bộ lọc ( 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)
Bỏ qua bất kỳ cảnh báo khấu hao; chỉ những người duy trì PyPdf cần quan tâm đến những người đó.
Nếu đầu vào được định hướng theo một cách khác thường, bạn có thể cần phải sử dụng các tọa độ khác nhau khi cắt ngắn các trang. Xem tại sao mã của tôi không phân chia chính xác từng trang trong pdf được quét?
Trong trường hợp nó hữu ích, đây là câu trả lời trước đây của tôi sử dụng kết hợp hai công cụ cộng với một số can thiệp thủ công:
- Pdfjam (ít nhất là phiên bản 2.0), dựa trên gói LaTeX pdf , để cắt các trang;
- Pdftk , để đặt nửa trái và phải trở lại với nhau.
Cả hai công cụ đều cần thiết vì theo như tôi có thể nói các trang pdf không thể áp dụng hai biến đổi khác nhau cho cùng một trang trong một luồng. Trong lệnh gọi đến pdftk
, thay thế 42 bằng số trang trong tài liệu đầu vào ( 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
Trong trường hợp bạn không có pdfjam 2.0, thì cài đặt PDFLaTeX là đủ với gói pdfpages (trên Ubuntu: bạn cần texlive-latex-khuyên và có lẽ (trên Ubuntu: khuyên dùng texlive-phông chữ ) và sử dụng trình điều khiển sau tập tin 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}
Sau đó chạy các lệnh sau, thay thế 42 bằng số trang trong tệp đầu vào (phải được gọi 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