DEV Community

Brad
Brad

Posted on

Python PDF Report Generator: Auto-Create Reports from Your Data

Python PDF Report Generator: Auto-Create Reports from Your Data

Stop spending 2 hours every week making the same report. This Python script generates formatted PDF reports automatically.

Install

pip install reportlab pandas
Enter fullscreen mode Exit fullscreen mode

The Script

from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, TableStyle, Spacer
from reportlab.lib.units import inch
import pandas as pd
from datetime import datetime

def generate_report(data, output_file):
    doc = SimpleDocTemplate(output_file, pagesize=letter)
    styles = getSampleStyleSheet()
    story = []

    # Title
    story.append(Paragraph('Weekly Sales Report', styles['Title']))
    story.append(Paragraph(f'Generated: {datetime.now().strftime("%B %d, %Y")}', styles['Normal']))
    story.append(Spacer(1, 0.2*inch))

    # Data table
    table_data = [list(data.columns)] + data.values.tolist()
    table = Table(table_data)
    table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#2E86AB')),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.grey),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, colors.HexColor('#F5F5F5')]),
    ]))
    story.append(table)
    doc.build(story)
    print(f'Report saved: {output_file}')

# Example usage
sales_df = pd.DataFrame({
    'Product': ['Widget A', 'Widget B', 'Widget C'],
    'Units': [450, 280, 161],
    'Revenue': ['$22,500', '$14,000', '$8,730'],
})

generate_report(sales_df, 'weekly_report.pdf')
Enter fullscreen mode Exit fullscreen mode

Schedule Weekly Reports

import schedule, time

def weekly_job():
    # load your data, generate report, email it
    generate_report(load_sales_data(), 'weekly_report.pdf')

schedule.every().monday.at('08:00').do(weekly_job)
while True:
    schedule.run_pending()
    time.sleep(60)
Enter fullscreen mode Exit fullscreen mode

Want 50 More Scripts?

The Python Business Automation Toolkit has PDF generators, email schedulers, data processors, and more.
$9 — instant download.

What reports are you generating manually every week?

Top comments (0)