Как мне «снять книгу» в формате pdf

10

У меня есть файл PDF, который был сделан в формате буклета. Он предназначен для печати на бумаге формата А4 в альбомной ориентации; Вот две страницы в PDF, которые должны соответствовать четырем страницам в настоящей книге.

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

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

Числа в скобках соответствуют порядку отдельных страниц.

Я знаю, что в linux есть все виды команд (pdfbook, pdfnup и т. Д.) (Которые, вероятно, использовались для создания этой брошюры). Как мне это «снять», то есть я хотел бы сделать из этого документ в формате pdf, где каждая отдельная страница конечного продукта представляет собой отдельную страницу pdf, упорядоченную обычным способом.

редактировать

Благодаря Жилю, мне удалось использовать следующий код:

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
источник
1
Я думаю, что это должно пойти на superuser.com
Адам Зальцман
@AdamZalcman Почему? Он ищет программу для Linux
Майкл Мрозек
2
Вы можете адаптировать ответ на этот вопрос (от Жиля) к вашей проблеме , то есть создать скрипт PyPdf.
sr_
Вы уверены, что не поменяли местами страницы 3 и 4? Я работал в печати; этот макет не имеет никакого смысла ....
Wildcard

Ответы:

4

Вот небольшой скрипт Python, использующий библиотеку PyPdf, которая делает эту работу. (Производный от un2up.) Сохраните его в скрипте с именем unbook, сделайте его исполняемым ( chmod +x unbook) и запустите его как фильтр ( unbook <book.pdf >1up.pdf).

Я тестировал этот скрипт на выходе pdfbook --signature=N. Для другого метода вам может не понадобиться переворачивать каждую другую входную страницу, и порядок страниц может быть другим (это зависит от ориентации альбомных страниц). Расположение страницы не соответствует вашему вопросу; 13,42 не имеет смысла для меня (в книге на 4 страницы 3 должно быть рядом с 2, а не рядом с 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)

Игнорировать любое предупреждение об устаревании; только сопровождающие PyPdf должны быть обеспокоены этим.

Жиль "ТАК - перестань быть злым"
источник
Это было задано некоторое время назад, но у меня возникли проблемы с реализацией вашего решения. Я использую OSX, установил python и py27-pypdf через MacPorts. Я создал файл unbook, скопировал и вставил скрипт. Выполнение команды в соответствии с инструкциями создает новый файл 1up.pdf с 0 байтами. В моем терминале нет ошибок или чего-либо еще, но после выполнения команды ничего не происходит (я должен выйти из CTRL-C); система не зависает и, похоже, ничего не делает. Как я могу отследить проблему? @Gilles
TSGM
@TSGM Наиболее вероятным объяснением является то, что вы забыли <перед входным файлом. Если вы действительно абсолютно уверены, что написали команду правильно, это может быть ошибка в библиотеке PyPdf (она еще не подвела меня, но это могло произойти).
Жиль "ТАК - перестать быть злым"
Проблема заключалась в том, что я должен был вызывать python через «python unbook <in.pdf> out.pdf». Я такой глупый. Кроме того, ваш код был немного странным (в конце он вставлял страницы second_half. Кажется, я исправил его для формата, который я написал в исходном посте). Я отредактировал свой оригинальный ответ, чтобы он содержал код, который я в конечном итоге использовал. Кроме того, команды размера страницы кажутся неправильными. Я исправил это также. @ Жиль
ЦГМ
@TSGM Код предполагает макет 1 | 4 на аверсе, 2 | 3 на реверсе, что является обычным макетом книги. Возможно, вам придется настроить его, если ваши страницы выложены по-другому. Это было проверено в полевых условиях в этой обстановке. Твоя необходимость явного вызова pythonбыла моей ошибкой: я должен был поставить линию Шебанга, добавил.
Жиль "ТАК - перестань быть злым"