Welcome, guest | Sign In | My Account | Store | Cart
"""
TablibToPDF.py
Author: Vasudev Ram
Copyright 2014 Vasudev Ram - www.dancingbison.com
This program is a demo of how to use the tablib and xtopdf Python libraries
to generate tabular data reports as PDF output.
Tablib is at: https://tablib.readthedocs.org/en/latest/
xtopdf is at: https://bitbucket.org/vasudevram/xtopdf
and info about xtopdf is at: http://slides.com/vasudevram/xtopdf or
at: http://slid.es/vasudevram/xtopdf
"""


import random
import tablib
from PDFWriter import PDFWriter

# Helper function to output a string to both screen and PDF.
def print_and_write(pw, strng):
   
print strng
    pw
.writeLine(strng)

# Set up grade and result names and mappings.
grade_letters
= ['F', 'E', 'D', 'C', 'B', 'A']
results
= {'A': 'Pass', 'B': 'Pass', 'C': 'Pass',
   
'D': 'Pass', 'E': 'Pass', 'F': 'Fail'}

# Create an empty Dataset and set its headers.
data
= tablib.Dataset()
data
.headers = ['ID', 'Name', 'Marks', 'Grade', 'Result']
widths
= [5, 12, 8, 8, 12] # Display widths for columns.

# Create some rows of student data and use it to populate the Dataset.
# Columns for each student row correspond to the header columns
# shown above.

for i in range(20):
    id
= str(i).zfill(2)
    name
= 'Student-' + id
   
# Let's grade them on the curve [1].
   
# This examiner doesn't give anyone 100 marks :)
    marks
= random.randint(40, 99)
   
# Compute grade from marks.
    grade
= grade_letters[(marks - 40) / 10]
    result
= results[grade]
    columns
= [id, name, marks, grade, result]
    row
= [ str(col).center(widths[idx]) for idx, col in enumerate(columns) ]
    data
.append(row)

# Set up the PDFWriter.
pw
= PDFWriter('student_grades.pdf')
pw
.setFont('Courier', 10)
pw
.setHeader('Student Grades Report - generated by xtopdf')
pw
.setFooter('xtopdf: http://slides.com/vasudevram/xtopdf')

# Generate header and data rows as strings; output them to screen and PDF.

separator
= '-' * sum(widths)
print_and_write
(pw, separator)

# Output headers
header_strs
= [ header.center(widths[idx]) for idx, header in enumerate(data.headers) ]
print_and_write
(pw, ''.join(header_strs))
print_and_write
(pw, separator)

# Output data
for row in data:
    print_and_write
(pw, ''.join(row))

print_and_write
(pw, separator)
pw
.close()

# [1] http://en.wikipedia.org/wiki/Grading_on_a_curve
# I'm not endorsing the idea of grading on a curve; I only used it as a
# simple algorithm to generate the marks and grades for this example.

History