Bagaimana cara 'menghapus' pdf

10

Saya memiliki file pdf yang dibuat menjadi format buklet. Ini dimaksudkan untuk mencetak pada kertas A4 dalam orientasi lanskap; di sini ada dua halaman di pdf, yang harus sesuai dengan empat halaman di buku yang sebenarnya.

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

Nomor kurung sesuai dengan urutan masing-masing halaman.

Saya tahu bahwa ada segala macam perintah (pdfbook, pdfnup, dll.) Di linux (yang mungkin digunakan untuk membuat buklet ini sejak awal). Bagaimana saya 'menghapusnya' --- yaitu, saya ingin membuat dokumen pdf dari sini di mana setiap halaman individu dari produk akhir adalah halaman individual pdf, dipesan dengan cara biasa.

Edit

Berkat Gilles, saya berhasil menggunakan kode berikut:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    print >> sys.stderr, 'splitting page',i
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2)
    p.mediaBox.lowerLeft = bl

    q.mediaBox.upperRight = ur
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2)

    if i % 2 == 0:
        output.addPage(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)
TSGM
sumber
1
Saya pikir ini harus pergi ke superuser.com
Adam Zalcman
@AdamZalcman Kenapa? Dia mencari program Linux
Michael Mrozek
2
Anda dapat menyesuaikan jawaban pertanyaan ini (oleh Gilles) dengan masalah Anda , yaitu membuat skrip PyPdf.
sr_
Apakah Anda yakin Anda belum menukar halaman 3 dan 4? Saya sudah bekerja di bidang pencetakan; tata letak itu tidak masuk akal ....
Wildcard

Jawaban:

4

Berikut skrip Python kecil menggunakan pustaka PyPdf yang melakukan pekerjaan. (Berasal dari un2up.) Simpan di skrip bernama unbook, buat itu dapat dieksekusi ( chmod +x unbook), dan jalankan sebagai filter ( unbook <book.pdf >1up.pdf).

Saya menguji skrip ini pada output dari pdfbook --signature=N. Untuk metode lain, Anda mungkin tidak perlu membalik setiap halaman input lainnya, dan urutan halaman mungkin berbeda (tergantung pada orientasi halaman lanskap). Disposisi halaman tidak cocok dengan pertanyaan Anda; 13,42 tidak masuk akal bagi saya (dalam buku 4 halaman, 3 harus di sebelah 2, bukan di sebelah 1).

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)

Abaikan peringatan penghentian apa pun; hanya pengelola PyPdf yang perlu memperhatikan hal ini.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini ditanya beberapa waktu lalu, tapi saya kesulitan mengimplementasikan solusi Anda. Saya menjalankan OSX, telah menginstal python dan py27-pypdf melalui MacPorts. Saya membuat file unbook dan menyalin dan menempelkan skrip. Menjalankan perintah seperti yang diperintahkan membuat file 1up.pdf baru dengan 0 byte. Tidak ada kesalahan atau apa pun yang tercantum di terminal saya, tetapi setelah menjalankan perintah, tidak ada yang terjadi (saya harus CTRL-C keluar); sistem tidak hang dan sepertinya tidak melakukan apa-apa. Bagaimana saya bisa melacak masalahnya? @Gilles
TSGM
@ TSGM Penjelasan yang paling mungkin adalah bahwa Anda lupa <sebelum file input. Jika Anda benar-benar yakin bahwa Anda menulis perintah dengan benar, itu bisa menjadi bug di pustaka PyPdf (itu belum gagal saya, tetapi itu bisa terjadi).
Gilles 'SO- berhenti bersikap jahat'
Masalahnya adalah saya seharusnya memanggil python melalui "python unbook <in.pdf> out.pdf". Saya konyol. Juga, kode Anda agak aneh (itu menempel halaman second_half semua pada akhirnya. Saya tampaknya telah memperbaikinya untuk format yang saya tulis di posting asli). Saya telah mengedit respons asli saya untuk memuat kode yang akhirnya saya gunakan. Juga, perintah ukuran halaman tampaknya salah. Saya memperbaikinya juga. @Gilles
TSGM
@ TSGM Kode ini mengasumsikan tata letak 1 | 4 terbalik, 2 | 3 terbalik, yang merupakan tata letak buku biasa. Anda mungkin perlu mengubahnya jika halaman Anda ditata secara berbeda. Itu diuji lapangan dalam pengaturan itu. Anda harus menelepon secara eksplisit pythonadalah kesalahan saya: saya harus meletakkan garis shebang, ditambahkan.
Gilles 'SO- stop being evil'