Обратная PDF-верстка

У меня есть навязанный документ: есть 4 × n Страницы А4 на n листы. Я положил их в роликовый сканер изображений и получил один 2 × n постраничный PDF документ (A3).

Если, скажем, n = 3, тогда у меня есть следующая последовательность страниц A3 в моем PDF:

  • первая страница: страница 12 (слева) и страница 1 оригинального документа
  • вторая страница: с.2 и р.11 оригинального документа
  • страница третья: с.10 и р.3...
  • ... и так до тех пор, пока...
  • страница шестая: с.6 и р.7 оригинального документа

Вопрос: как восстановить исходную последовательность страниц в одном файле PDF формата А4? Т.е. я хочу сделать это:

--A3--         --A4--
[12| 1]         [1]
[ 2|11]         [2]
[10| 3]    ⇒    [3]
   …             … 
[ 6| 7]         [6]
                [7]
                 … 
                [12]

В Linux я обычно использую pdftk или же pdftops-подобно консольные утилиты для подобных случаев, но я не могу понять, как их использовать для моих текущих целей.

1 ответ

Решение

Через некоторое время я нашел эту тему и немного настроил код:

import copy
import sys
import math
import pyPdf

def split_pages(src, dst):
    src_f = file(src, 'r+b')
    dst_f = file(dst, 'w+b')

    input_PDF = pyPdf.PdfFileReader(src_f)
    num_pages = input_PDF.getNumPages()

    first_half, second_half = [], []

    for i in range(num_pages):
        p = input_PDF.getPage(i)
        q = copy.copy(p)
        q.mediaBox = copy.copy(p.mediaBox)

        x1, x2 = p.mediaBox.lowerLeft
        x3, x4 = p.mediaBox.upperRight

        x1, x2 = math.floor(x1), math.floor(x2)
        x3, x4 = math.floor(x3), math.floor(x4)
        x5, x6 = math.floor(x3/2), math.floor(x4/2)

        if x3 > x4:
            # horizontal
            p.mediaBox.upperRight = (x5, x4)
            p.mediaBox.lowerLeft = (x1, x2)

            q.mediaBox.upperRight = (x3, x4)
            q.mediaBox.lowerLeft = (x5, x2)
        else:
            # vertical
            p.mediaBox.upperRight = (x3, x4)
            p.mediaBox.lowerLeft = (x1, x6)

            q.mediaBox.upperRight = (x3, x6)
            q.mediaBox.lowerLeft = (x1, x2)


        if i in range(1,num_pages+1,2):
            first_half += [p]
            second_half += [q]
        else:
            first_half += [q]
            second_half += [p]

    output = pyPdf.PdfFileWriter()
    for page in first_half + second_half[::-1]:
        output.addPage(page)

    output.write(dst_f)
    src_f.close()
    dst_f.close()

if len(sys.argv) < 3:
    print("\nusage:\n$ python reverse_impose.py input.pdf output.pdf")
    sys.exit()

input_file = sys.argv[1]
output_file = sys.argv[2]

split_pages(input_file,output_file)

Смотрите эту суть.

Другие вопросы по тегам