Làm thế nào để tôi 'unbook' một pdf


10

Tôi có một tập tin pdf được tạo thành định dạng tập sách. Nó có nghĩa là để in trên giấy A4 theo hướng ngang; đây là hai trang trong pdf, tương ứng với bốn trang trong sách thực tế.

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

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

Các số được đặt trong ngoặc tương ứng với thứ tự của các trang riêng lẻ.

Tôi biết rằng có tất cả các loại lệnh (pdfbook, pdfnup, v.v.) trên linux (có lẽ được sử dụng để tạo tập sách này ở vị trí đầu tiên). Làm thế nào để tôi 'unbook' nó --- nghĩa là tôi muốn tạo một tài liệu pdf từ đây trong đó mỗi trang riêng lẻ của sản phẩm cuối cùng là một trang riêng của pdf, được đặt hàng theo cách thông thường.

Biên tập

Nhờ Gilles, tôi quản lý để sử dụng mã sau đây:

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)

1
Tôi nghĩ rằng điều này nên đến superuser.com
Adam Zalcman

@AdamZalcman Tại sao? Anh ấy đang tìm kiếm một chương trình Linux
Michael Mrozek

2
sr_

Bạn có chắc là bạn đã tráo đổi trang 3 và 4 không? Tôi đã làm việc trong ngành in ấn; bố cục đó không có ý nghĩa gì ....
Wildcard

Câu trả lời:


4

Đâ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. (Có nguồn gốc từ un2up.) Lưu nó trong một tập lệnh được gọi unbook, làm cho nó có thể thực thi được ( chmod +x unbook) và chạy nó dưới dạng bộ lọc ( unbook <book.pdf >1up.pdf).

Tôi đã thử nghiệm kịch bản này trên đầu ra của pdfbook --signature=N. Đối với phương pháp khác, bạn có thể không cần đảo ngược mọi trang đầu vào khác và thứ tự trang có thể khác (tùy thuộc vào hướng của các trang ngang). Bố trí trang không khớp với câu hỏi của bạn; 13,42 không có ý nghĩa với tôi (trong một cuốn sách 4 trang, 3 nên ở bên cạnh 2, không phải bên cạnh 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)

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 điều này.


Điều này đã được hỏi một thời gian trước đây, nhưng tôi gặp khó khăn khi thực hiện giải pháp của bạn. Tôi đang chạy OSX, đã cài đặt python và py27-pypdf thông qua MacPorts. Tôi đã tạo một tập tin unbook và sao chép và dán tập lệnh. Chạy lệnh theo hướng dẫn sẽ tạo tệp 1up.pdf mới với 0 byte. Không có lỗi hoặc bất cứ điều gì được liệt kê trong thiết bị đầu cuối của tôi, nhưng khi thực hiện lệnh, không có gì xảy ra (tôi phải tắt CTRL-C); hệ thống không treo và dường như không làm gì cả. Làm thế nào tôi có thể theo dõi vấn đề? @Gilles
TSGM

@TSGM Giải thích có thể xảy ra nhất là bạn đã quên <trước tập tin đầu vào. Nếu bạn thực sự chắc chắn rằng bạn đã viết lệnh chính xác, đó có thể là một lỗi trong thư viện PyPdf (nó chưa làm tôi thất bại, nhưng nó có thể xảy ra).
Gilles 'SO- ngừng trở nên xấu xa'

Vấn đề là tôi phải gọi python qua "python unbook <in.pdf> out.pdf". Tôi thật ngốc. Ngoài ra, mã của bạn hơi lạ (cuối cùng nó đã dán các trang second_half. Tôi dường như đã sửa nó cho định dạng mà tôi đã viết trong bài viết gốc). Tôi đã chỉnh sửa phản hồi ban đầu của mình để chứa mã mà cuối cùng tôi đã sử dụng. Ngoài ra, các lệnh kích thước trang dường như là sai. Tôi cũng sửa nó. @Gilles
TSGM

@TSGM Mã giả định bố cục 1 | 4 ngược, 2 | 3 ngược, đó là bố cục sách thông thường. Bạn có thể cần phải điều chỉnh nó nếu các trang của bạn được đặt khác nhau. Nó đã được thử nghiệm tại hiện trường trong thiết lập đó. Việc bạn phải gọi một cách rõ ràng pythonlà sai lầm của tôi: Tôi nên đặt một dòng shebang, thêm vào.
Gilles 'SO- đừng trở nên xấu xa'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.