Invoice Template Skill Overview This skill generates professional PDF invoices from structured data and templates. Create invoices with company branding, itemized lists, tax calculations, and payment details. How to Use Describe what you want to accomplish Provide any required input data or files I'll execute the appropriate operations Example prompts: "Generate invoices from order data" "Create recurring invoices" "Batch generate monthly invoices" "Customize invoice templates per client" Domain Knowledge Invoice Data Structure invoice_data = { "invoice_number" : "INV-2026-001" , "date" : "2026-01-30" , "due_date" : "2026-02-28" , "from" : { "name" : "Your Company" , "address" : "123 Business St" , "email" : "billing@company.com" } , "to" : { "name" : "Client Name" , "address" : "456 Client Ave" , "email" : "client@example.com" } , "items" : [ { "description" : "Consulting" , "quantity" : 10 , "rate" : 150.00 } , { "description" : "Development" , "quantity" : 20 , "rate" : 100.00 } ] , "tax_rate" : 0.08 , "notes" : "Payment due within 30 days" } PDF Generation with ReportLab from reportlab . lib . pagesizes import letter from reportlab . pdfgen import canvas from reportlab . lib . units import inch def create_invoice ( data : dict , output_path : str ) : c = canvas . Canvas ( output_path , pagesize = letter ) width , height = letter
Header
c . setFont ( "Helvetica-Bold" , 24 ) c . drawString ( 1 * inch , height - 1 * inch , "INVOICE" )
Invoice details
c . setFont ( "Helvetica" , 12 ) c . drawString ( 1 * inch , height - 1.5 * inch , f"Invoice #: { data [ 'invoice_number' ] } " ) c . drawString ( 1 * inch , height - 1.75 * inch , f"Date: { data [ 'date' ] } " )
From/To
y
height
2.5 * inch c . drawString ( 1 * inch , y , f"From: { data [ 'from' ] [ 'name' ] } " ) c . drawString ( 4 * inch , y , f"To: { data [ 'to' ] [ 'name' ] } " )
Items table
y
height
4 * inch c . setFont ( "Helvetica-Bold" , 10 ) c . drawString ( 1 * inch , y , "Description" ) c . drawString ( 4 * inch , y , "Qty" ) c . drawString ( 5 * inch , y , "Rate" ) c . drawString ( 6 * inch , y , "Amount" ) c . setFont ( "Helvetica" , 10 ) subtotal = 0 for item in data [ 'items' ] : y -= 0.3 * inch amount = item [ 'quantity' ] * item [ 'rate' ] subtotal += amount c . drawString ( 1 * inch , y , item [ 'description' ] ) c . drawString ( 4 * inch , y , str ( item [ 'quantity' ] ) ) c . drawString ( 5 * inch , y , f"$ { item [ 'rate' ] : .2f } " ) c . drawString ( 6 * inch , y , f"$ { amount : .2f } " )
Totals
tax
subtotal * data [ 'tax_rate' ] total = subtotal + tax y -= 0.5 * inch c . drawString ( 5 * inch , y , f"Subtotal: $ { subtotal : .2f } " ) y -= 0.25 * inch c . drawString ( 5 * inch , y , f"Tax ( { data [ 'tax_rate' ] * 100 } %): $ { tax : .2f } " ) y -= 0.25 * inch c . setFont ( "Helvetica-Bold" , 12 ) c . drawString ( 5 * inch , y , f"Total: $ { total : .2f } " ) c . save ( ) return output_path HTML Template Approach from weasyprint import HTML from jinja2 import Template invoice_template = """
INVOICE
Invoice #: {{ invoice_number }}
Date: {{ date }}
| Description | Qty | Rate | Amount |
|---|---|---|---|
| {{ item.description }} | {{ item.quantity }} | ${{ "%.2f"|format(item.rate) }} | ${{ "%.2f"|format(item.quantity * item.rate) }} |
Total: ${{ "%.2f"|format(total) }}
""" def create_invoice_html ( data : dict , output_path : str ) : template = Template ( invoice_template )
Calculate total
total
sum ( i [ 'quantity' ] * i [ 'rate' ] for i in data [ 'items' ] ) total *= ( 1 + data . get ( 'tax_rate' , 0 ) ) data [ 'total' ] = total html = template . render ( ** data ) HTML ( string = html ) . write_pdf ( output_path ) return output_path Best Practices Validate required fields before generation Use templates for consistent branding Auto-calculate totals (don't trust input) Include payment instructions and terms Installation
Install required dependencies
pip install python-docx openpyxl python-pptx reportlab jinja2 Resources easy-invoice-pdf Repository Claude Office Skills Hub