0

私は Python が初めてで、既存のスクリプトを把握しようとしています。この例は、次のように pdfrw から提供されます: http://code.google.com/p/pdfrw/wiki/ExampleTools

「派手なプリンターやAcrobatの完全なコピーを備えたプリンターは、小さなPDFを簡単に小さな小冊子に変えることができます(たとえば、4つのレターサイズのページを1つの11インチx 17インチに印刷します).

ただし、これは、担当者がハードウェアとソフトウェアの操作方法を知っていることなど、いくつかのことを前提としています。booklet.py を使用すると、PDF を書式設定済みの小冊子に変換して、混乱を招く可能性を減らすことができます:"

手順は次のとおりです。

  • 関数はページのループを開始します
  • ??? を行う変数「shift_right」が宣言されています。(メタデータ用だと思いますか?)
  • メタデータにのみ役立つ変数「もの」が宣言されています(私は思う)
  • x は、BBox リストの 3 番目のインデックスによってインクリメントされます (このリストは何ですか? いつ作成されたのですか?)
  • y は、y と Bbox リストの 3 番目のインデックスの間の大きい方の値に割り当てられます (繰り返しますが、このリストは何を参照していますか?)

私の混乱の中心は、BBox を使用したこれらの 2 つの行と、それらがどのように相互作用して 11x17 のブックレット PDF を作成するかに関するものだと思います。これをクリアできる人に感謝します。

    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

1 に答える 1

4

Bbox は通常、「境界ボックス」の省略形です。この場合、ページの寸法を定義する長方形です。この場合、4 つの数値の配列のように見えます。最初の 2 つはページの左上隅 (0,0) で、3 番目はページの右側の x 座標です。 (左側が 0 であるため、幅でもあります)、4 番目はページの下部/高さです。

于 2013-03-28T14:57:46.980 に答える