2013-03-28 13 views
0

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

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

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

Насколько я могу сказать шаги являются:

  • функция начинает цикл через страницы
  • объявляется переменная «shift_right», которая делает ??? (Я думаю, что это для метаданных?)
  • объявлен переменный «материал», который полезен только для метаданных (я думаю)
  • x увеличивается на третий индекс списка BBox (что это за список, когда она была создана?)
  • у присваивается большее значение между у и третий индекс списка 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) 

ответ

4

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

 Смежные вопросы

  • Нет связанных вопросов^_^