def makeA3(ipath, opath, onesided=False): """Take the first 4 (A4) pages of the input file and place them in "booklet" order on an A3 sheet (double-sided, short-side join). If <onesided> is <True>, or there are only two pages in the input file, place the first two (A4) pages on one side of an A3 sheet, the first page on the right-hand side. Note that the input pages do not have to be A4, the output will simply be twice as wide (as the first page). All input pages should have the same size. """ ipages = PdfReader(ipath).pages # Make sure we have an even number of pages if len(ipages) & 1: ipages.append(None) fpage = PageMerge() fpage.add(ipages[0]) width = fpage[0].w opages = [] if onesided or len(ipages) == 2: p4 = ipages[1] else: p4 = ipages[3] bpage = PageMerge() bpage.add(ipages[1]) bpage.add(ipages[2], prepend=True) bpage[0].x = width opages.append(bpage.render()) if p4: fpage.add(p4) fpage[0].x = width opages.insert(0, fpage.render()) PdfWriter().addpages(opages).write(opath)
def read_and_double(inpfn): pages = PdfReader(inpfn, decompress=False).pages pages = [pagexobj(x) for x in pages] if len(pages) & 1: pages.append(pages[0]) # Sentinel -- get same size for back as front xobjs = [] while len(pages) > 2: xobjs.append((pages.pop(), pages.pop(0))) xobjs.append((pages.pop(0), pages.pop())) xobjs += [(x,) for x in pages] return xobjs
def read_and_double(inpfn): pages = PdfReader(inpfn, decompress=False).pages pages = [pagexobj(x) for x in pages] if len(pages) & 1: pages.append(pages[0]) # Sentinel -- get same size for back as front xobjs = [] while len(pages) > 2: xobjs.append((pages.pop(), pages.pop(0))) xobjs.append((pages.pop(0), pages.pop())) xobjs += [(x, ) for x in pages] return xobjs
def make_booklet(pdf_file: str, out_put: str = None) -> None: out_put = out_put if out_put is not None else pdf_file ipages = PdfReader(pdf_file).pages if len(ipages) & 1: ipages.append(None) opages = [] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0))) opages.append(fixpage(ipages.pop(0), ipages.pop())) opages += ipages PdfWriter().addpages(opages).write(out_put)
def generate_booklet(input_file, output_file): ipages = PdfReader(input_file).pages # Make sure we have 4*n pages while len(ipages) % 4: ipages.append(None) opages = [] while len(ipages): opages.append(fixpage(ipages.pop(), ipages.pop(0))) opages.append(fixpage(ipages.pop(0), ipages.pop())) opages += ipages PdfWriter().addpages(opages).write(output_file) show_file(output_file)
# 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)
def fixpage(*pages): result = PageMerge() + (x for x in pages if x is not None) result[-1].x += result[0].w return result.render() INPFN, = sys.argv[1:] OUTFN = 'booklet.' + os.path.basename(INPFN) ALL_IPAGES = PdfReader(INPFN).pages print 'The pdf file ' + str(INPFN) + ' has ' + str(len(ALL_IPAGES)) + ' pages.' #Make sure we have an even number if len(ALL_IPAGES) & 1: ALL_IPAGES.append(None) print 'Inserting one more blank page to make pages number even.' NUM_OF_ITER, ITERS_LEFT = divmod(len(ALL_IPAGES), BOOKLET_SIZE) print 'Making ' + str(NUM_OF_ITER) + ' subbooklets of ' + str( BOOKLET_SIZE) + ' pages each.' opages = [] for iteration in range(0, NUM_OF_ITER): ipages = ALL_IPAGES[iteration * BOOKLET_SIZE:(iteration + 1) * BOOKLET_SIZE] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0))) opages.append(fixpage(ipages.pop(0), ipages.pop())) # Making one more subbooklet with the left pages ipages = ALL_IPAGES[len(ALL_IPAGES) - ITERS_LEFT:len(ALL_IPAGES)]
BOOKLET_SIZE = 20 START = time.time() def fixpage(*pages): result = PageMerge() + (x for x in pages if x is not None) result[-1].x += result[0].w return result.render() INPFN, = sys.argv[1:] OUTFN = 'booklet.' + os.path.basename(INPFN) ALL_IPAGES = PdfReader(INPFN).pages print 'The pdf file '+str(INPFN)+' has '+str(len(ALL_IPAGES))+' pages.' #Make sure we have an even number if len(ALL_IPAGES) & 1: ALL_IPAGES.append(None) print 'Inserting one more blank page to make pages number even.' NUM_OF_ITER, ITERS_LEFT = divmod(len(ALL_IPAGES), BOOKLET_SIZE) print 'Making '+str(NUM_OF_ITER)+' subbooklets of '+str(BOOKLET_SIZE)+' pages each.' opages = [] for iteration in range(0, NUM_OF_ITER): ipages = ALL_IPAGES[iteration*BOOKLET_SIZE:(iteration+1)*BOOKLET_SIZE] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0))) opages.append(fixpage(ipages.pop(0), ipages.pop())) # Making one more subbooklet with the left pages ipages = ALL_IPAGES[len(ALL_IPAGES)-ITERS_LEFT:len(ALL_IPAGES)] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0)))
''' import sys import os from pdfrw import PdfReader, PdfWriter, PageMerge def fixpage(*pages): result = PageMerge() + (x for x in pages if x is not None) result[-1].x += result[0].w return result.render() inpfn, = sys.argv[1:] outfn = 'booklet.' + os.path.basename(inpfn) ipages = PdfReader(inpfn).pages # Make sure we have an even number if len(ipages) & 1: ipages.append(None) opages = [] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0))) opages.append(fixpage(ipages.pop(0), ipages.pop())) opages += ipages PdfWriter().addpages(opages).write(outfn)
# 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, decompress=False).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)
BOOKLET_SIZE = 20 start = time.time() def fixpage(*pages): result = PageMerge() + (x for x in pages if x is not None) result[-1].x += result[0].w return result.render() inpfn, = sys.argv[1:] outfn = 'booklet.' + os.path.basename(inpfn) allipages = PdfReader(inpfn).pages print 'The pdf file '+str(inpfn)+' has '+str(len(allipages))+' pages.' #Make sure we have an even number if len(allipages) & 1: allipages.append(None) print 'Inserting one more blank page to make pages number even.' num_of_iter, iters_left = divmod(len(allipages), BOOKLET_SIZE) print 'Making '+str(num_of_iter)+' subbooklets of '+str(BOOKLET_SIZE)+' pages each.' opages = [] for iteration in range(0,num_of_iter): ipages = allipages[iteration*BOOKLET_SIZE:(iteration+1)*BOOKLET_SIZE] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0))) opages.append(fixpage(ipages.pop(0), ipages.pop())) # Making one more subbooklet with the left pages ipages = allipages[len(allipages)-iters_left:len(allipages)] while len(ipages) > 2: opages.append(fixpage(ipages.pop(), ipages.pop(0)))