私は 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)