#!/usr/bin/env python3 import argparse from random import randint from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.units import mm, cm def draw_seyes_grid(canvas, x_offset, y_offset): nb_cols = 5 nb_lines = 3 # x, y: pdf coordinates canvas.setStrokeColor("lightblue") xs = [x*8*mm + x_offset for x in range(0, nb_cols + 1)] ys = [x*2*mm + y_offset for x in range(0, (nb_lines + 1) * 3)] canvas.grid(xs, ys) canvas.setStrokeColor("purple") xs = [x*8*mm + x_offset for x in range(0, nb_cols + 1)] ys = [y*8*mm +y_offset for y in range(0, nb_lines + 1)] canvas.grid(xs, ys) canvas.setStrokeColor("black") canvas.line(x_offset + 1*mm, y_offset + 6*mm, x_offset + ((nb_cols * 8) - 1)*mm, y_offset + 6*mm) def draw_char(canvas, x_origin, y_origin, x, y, mychar): # x_origin, y_origin : pdf coordinates # x, y: represent a cell number, a cell is 8*8mm (seyes ruling) canvas.drawCentredString(x_origin + x*8*mm + 4*mm, y_origin + y*8*mm + 0.5*mm, mychar) def draw_number(canvas, x_offset, y_offset, num, line): digits = list(str(num)) pos = [4, 3, 2, 1] for (digit, column_nb) in zip(reversed(digits), pos): draw_char(canvas, x_offset, y_offset, column_nb, line, digit) def draw_addition(canvas, x_offset, y_offset, a, b): # Draw "a+b" operation # First, draw a seyes-like grid draw_seyes_grid(canvas, x_offset, y_offset) # draw first number draw_number(canvas, x_offset, y_offset, a, 2) # draw operator draw_char(canvas, x_offset, y_offset, 0, 1, "+") # draw second number draw_number(canvas, x_offset, y_offset, b, 1) def main(outfile): # reportlab setup c = canvas.Canvas(outfile, pagesize=A4) c.setFont('Helvetica', 22) for i in range(4): for j in range(7): x = 1*cm + i*5*cm y = 26*cm - j*4*cm draw_addition(c, x, y, randint(1, 9999), randint(1, 9999)) # reportlab: end page + save pdf c.showPage() c.save() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument("out", help="Name of output pdf file") parser.parse_args() main("plop.pdf")