На что ссылается bbox в этом скрипте?

Я новичок в Python и пытаюсь понять существующие сценарии. Этот пример взят из pdfrw следующим образом: http://code.google.com/p/pdfrw/wiki/ExampleTools

"Принтер с необычным принтером и / или полной копией Acrobat может легко превратить ваш маленький PDF в небольшой буклет (например, напечатать 4 страницы размером с одну букву на одном 11" x 17").

Но это предполагает несколько вещей, включая то, что персонал знает, как управлять аппаратным и программным обеспечением. booklet.py позволяет превратить ваш PDF-файл в предварительно отформатированный буклет, чтобы дать им меньше шансов испортить его:"

Как я могу сказать, шаги:

  • функция начинает перебирать страницы
  • переменная "shift_right" объявляется, что делает??? (Я думаю это для метаданных?)
  • объявляется переменная "материал", которая полезна только для метаданных (я думаю)
  • x увеличивается на третий индекс списка BBox (что это за список, когда он был создан?)
  • y назначается большему значению между y и третьим индексом списка Bbox (опять же, к чему относится этот список?)

Я думаю, что моя основная путаница связана с этими двумя строками с BBox и с тем, как они взаимодействуют, создавая PDF-файл буклета 11x17. Спасибо за всех, кто может это прояснить.

    import sys
    import os

    import find_pdfrw
    from pdfrw import PdfReader, PdfWriter, PdfDict, PdfArray, PdfName, IndirectPdfDict
    from pdfrw.buildxobj import pagexobj
def fixpage(*pages):
    pages = [pagexobj(x) for x in pages]

    class PageStuff(tuple):
        pass

    x = y = 0
    for i, page in enumerate(pages):
        index = '/P%s' % i
        shift_right = x and '1 0 0 1 %s 0 cm ' % x or ''
        stuff = PageStuff((index, page))
        stuff.stream = 'q %s%s Do Q\n' % (shift_right, index)
        x += page.BBox[2]
        y = max(y, page.BBox[3])
        pages[i] = stuff

    # Multiple copies of first page used as a placeholder to
    # get blank page on back.
    for p1, p2 in zip(pages, pages[1:]):
        if p1[1] is p2[1]:
            pages.remove(p1)

    return IndirectPdfDict(
        Type = PdfName.Page,
        Contents = PdfDict(stream=''.join(page.stream for page in pages)),
        MediaBox = PdfArray([0, 0, x, y]),
        Resources = PdfDict(
            XObject = PdfDict(pages),
        ),
    )

inpfn, = sys.argv[1:]
outfn = 'booklet.' + os.path.basename(inpfn)
pages = PdfReader(inpfn).pages

# Use page1 as a marker to print a blank at the end
if len(pages) & 1:
    pages.append(pages[0])

bigpages = []
while len(pages) > 2:
    bigpages.append(fixpage(pages.pop(), pages.pop(0)))
    bigpages.append(fixpage(pages.pop(0), pages.pop()))

bigpages += pages

PdfWriter().addpages(bigpages).write(outfn)

1 ответ

Bbox обычно является сокращением для "ограничительной рамки": в данном случае это прямоугольник, определяющий размеры вашей страницы. В данном случае это выглядит как массив из 4 чисел, первые два из которых - верхний левый угол страницы в точке (0,0), третье - координата x правой части страницы. (который, потому что левая сторона в 0, является также шириной), и четвертый - основание / высота страницы.

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