Habit Tracker PDF Printable

Python script to generate monthly printable Habit Tracker

9/27/20251 min read

photo of white staircase
photo of white staircase

from reportlab.lib.pagesizes import A4, landscape

from reportlab.pdfgen import canvas

from reportlab.lib.units import cm

from reportlab.lib import colors

from reportlab.pdfbase import pdfmetrics

from reportlab.pdfbase.cidfonts import UnicodeCIDFont

# Register font for compatibility

pdfmetrics.registerFont(UnicodeCIDFont('HeiseiMin-W3'))

def create_light_theme_checkbox_printable(filename):

c = canvas.Canvas(filename, pagesize=landscape(A4))

width, height = landscape(A4)

# Colors (light theme)

header_color = colors.HexColor("#b3e5fc") # light cyan

day_bg = colors.HexColor("#e1f5fe") # very light cyan

grid_color = colors.HexColor("#bbbbbb")

# Header bar

c.setFillColor(header_color)

c.rect(0, height-2*cm, width, 2*cm, stroke=0, fill=1)

c.setFillColor(colors.black)

c.setFont("HeiseiMin-W3", 16)

c.drawCentredString(width/2, height-1.2*cm, "Habit Tracker – Month: ____________________")

# Table settings

left_margin = 2*cm

top_start = height - 3.5*cm

row_height = 1.2*cm

col_width = 0.7*cm

# Day headers (1–31)

for d in range(31):

x = left_margin + 4.5*cm + d*col_width

c.setFillColor(day_bg)

c.rect(x, top_start, col_width, row_height, stroke=0, fill=1)

c.setFillColor(colors.black)

c.setFont("HeiseiMin-W3", 8)

c.drawCentredString(x+col_width/2, top_start+0.35*cm, str(d+1))

# Habit rows (10 rows, blank habit column)

for i in range(10):

y = top_start - (i+1)*row_height

# Habit label space (blank, for user to write)

c.setStrokeColor(grid_color)

c.rect(left_margin, y, 3.5*cm, row_height, stroke=1, fill=0)

# Checkbox cells for days

for d in range(31):

x = left_margin + 4.5*cm + d*col_width

c.setStrokeColor(grid_color)

c.rect(x, y, col_width, row_height, stroke=1, fill=0)

# Draw small checkbox inside each cell

cb_size = 0.35*cm

cb_x = x + (col_width - cb_size)/2

cb_y = y + (row_height - cb_size)/2

c.rect(cb_x, cb_y, cb_size, cb_size, stroke=1, fill=0)

# Footer

c.setFont("HeiseiMin-W3", 9)

c.setFillColor(colors.black)

c.drawCentredString(width/2, 1*cm, "Created by Code2Compass ✦ For personal use")

c.showPage()

c.save()

# Generate light theme printable PDF with checkboxes

create_light_theme_checkbox_printable("/mnt/data/HabitTracker-Printable-Landscape-LightCheckbox.pdf")

"/mnt/data/HabitTracker-Printable-Landscape-LightCheckbox.pdf"