DEV Community

Lucas Gragg
Lucas Gragg

Posted on

Building an invoice generator with ReportLab

When I started freelancing, I quickly realized that generating professional-looking invoices was a chore. I'd spend hours tweaking Microsoft Word templates, making sure the numbers added up and the layout looked decent. It was a tedious process, and I knew there had to be a better way. That's when I discovered ReportLab, a Python library that allows you to generate PDF documents programmatically. With ReportLab, I was able to automate the invoice generation process, saving myself a significant amount of time and effort.

Getting Started with ReportLab

To get started with ReportLab, you'll need to install the library using pip. Once installed, you can begin generating PDF documents using the SimpleDocTemplate class. This class provides a simple way to create PDFs with basic layout and styling. For example, you can use the following code to generate a basic PDF document:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Paragraph

# Create a new PDF document
doc = SimpleDocTemplate("example.pdf", pagesize=letter)

# Add a paragraph to the document
styles = getSampleStyleSheet()
story = [Paragraph("This is a sample paragraph.", styles["Normal"])]

# Build the document
doc.build(story)
Enter fullscreen mode Exit fullscreen mode

This code generates a basic PDF document with a single paragraph of text.

Creating an Invoice Template

To create an invoice template, you'll need to define a layout that includes fields for the invoice number, date, client information, and line items. You can use the Table class from ReportLab to create a table for the line items. Here's an example of how you might define an invoice template:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table, TableStyle

# Define the invoice template
class InvoiceTemplate:
    def __init__(self, invoice_number, date, client_name, line_items):
        self.invoice_number = invoice_number
        self.date = date
        self.client_name = client_name
        self.line_items = line_items

    def generate_pdf(self):
        # Create a new PDF document
        doc = SimpleDocTemplate("invoice.pdf", pagesize=letter)

        # Add the invoice header
        story = [Paragraph(f"Invoice Number: {self.invoice_number}", getSampleStyleSheet()["Heading1"])]
        story.append(Paragraph(f"Date: {self.date}", getSampleStyleSheet()["Normal"]))
        story.append(Paragraph(f"Client: {self.client_name}", getSampleStyleSheet()["Normal"]))

        # Add the line items table
        table_data = [["Item", "Quantity", "Price"]]
        for item in self.line_items:
            table_data.append([item["name"], item["quantity"], item["price"]])
        table = Table(table_data)
        table_style = TableStyle([
            ("GRID", (0, 0), (-1, -1), 0.5, (0, 0, 0)),
            ("FONTNAME", (0, 0), (-1, -1), "Helvetica"),
            ("FONTSIZE", (0, 0), (-1, -1), 12),
        ])
        table.setStyle(table_style)
        story.append(table)

        # Build the document
        doc.build(story)
Enter fullscreen mode Exit fullscreen mode

This code defines a basic invoice template with fields for the invoice number, date, client information, and line items.

Putting it all Together

I actually packaged this into a tool called Invoice Generator if you want the full working version, which you can find at https://lukegraggster.gumroad.com/l/invoice-generator?utm_source=devto&utm_medium=blog&utm_campaign=traffic_bot. This tool allows you to generate professional-looking invoices with customizable templates, automatic calculations, and client management. It's been a huge time-saver for me, and I think it could be really helpful for other freelancers and small businesses as well. With the Invoice Generator, you can create professional PDF invoices in seconds, and it's only $29. I'm really proud of how it's turned out, and I think it's a great solution for anyone who needs to generate invoices on a regular basis.

Top comments (0)