Welcome, guest | Sign In | My Account | Store | Cart
from __future__ import print_function

# ControlBreakToPDF.py
# A program to show how to write simple control break reports
# and send the output to PDF, using itertools.groupby and xtopdf.
# Author: Vasudev Ram
# Copyright 2016 Vasudev Ram
# http://jugad2.blogspot.com
# https://gumroad.com/vasudevram

from itertools import groupby
from PDFWriter import PDFWriter

# I hard-code the data here to make the example shorter.
# More commonly, it would be fetched at run-time from a
# database query or CSV file or similar source.

data
= \
[
   
['North', 'Desktop #1', 1000],
   
['South', 'Desktop #3', 1100],
   
['North', 'Laptop #7', 1200],
   
['South', 'Keyboard #4', 200],
   
['North', 'Mouse #2', 50],
   
['East', 'Tablet #5', 200],
   
['West', 'Hard disk #8', 500],
   
['West', 'CD-ROM #6', 150],
   
['South', 'DVD Drive', 150],
   
['East', 'Offline UPS', 250],
]

pw
= PDFWriter('SalesReport.pdf')
pw
.setFont('Courier', 12)
pw
.setHeader('Sales by Region')
pw
.setFooter('Using itertools.groupby and xtopdf')

# Convenience function to both print to screen and write to PDF.
def print_and_write(s, pw):
   
print(s)
    pw
.writeLine(s)

# Set column headers.
headers
= ['Region', 'Item', 'Sale Value']
# Set column widths.
widths
= [ 10, 15, 10 ]
# Build header string for report.
header_str
= ''.join([hdr.center(widths[ind]) \
   
for ind, hdr in enumerate(headers)])
print_and_write
(header_str, pw)

# Function to base the sorting and grouping on.
def key_func(rec):
   
return rec[0]

data
.sort(key=key_func)

for region, group in groupby(data, key=key_func):
    print_and_write
('', pw)
   
# Write group header, i.e. region name.
    print_and_write
(region.center(widths[0]), pw)
   
# Write group's rows, i.e. sales data for the region.
   
for row in group:
       
# Build formatted row string.
        row_str
= ''.join(str(col).rjust(widths[ind + 1]) \
           
for ind, col in enumerate(row[1:]))
        print_and_write
(' ' * widths[0] + row_str, pw)
pw
.close()

History