1#!/usr/bin/env python
2
3'''
4usage:   4up.py my.pdf
5
6
7Uses Form XObjects and reportlab to create 4up.my.pdf.
8
9Demonstrates use of pdfrw with reportlab.
10
11'''
12
13import sys
14import os
15
16from reportlab.pdfgen.canvas import Canvas
17
18from pdfrw import PdfReader
19from pdfrw.buildxobj import pagexobj
20from pdfrw.toreportlab import makerl
21
22
23def addpage(canvas, allpages):
24    pages = allpages[:4]
25    del allpages[:4]
26
27    x_max = max(page.BBox[2] for page in pages)
28    y_max = max(page.BBox[3] for page in pages)
29
30    canvas.setPageSize((x_max, y_max))
31
32    for index, page in enumerate(pages):
33        x = x_max * (index & 1) / 2.0
34        y = y_max * (index <= 1) / 2.0
35        canvas.saveState()
36        canvas.translate(x, y)
37        canvas.scale(0.5, 0.5)
38        canvas.doForm(makerl(canvas, page))
39        canvas.restoreState()
40    canvas.showPage()
41
42
43def go(argv):
44    inpfn, = argv
45    outfn = '4up.' + os.path.basename(inpfn)
46
47    pages = PdfReader(inpfn).pages
48    pages = [pagexobj(x) for x in pages]
49    canvas = Canvas(outfn)
50
51    while pages:
52        addpage(canvas, pages)
53    canvas.save()
54
55if __name__ == '__main__':
56    go(sys.argv[1:])
57