ReportLab is an open-source Python library designed for generating PDF documents programmatically. It's particularly powerful for creating dynamic, data-driven PDFs, reports, invoices, and other complex documents with precise layout control.
Key Features and Capabilities:
1. Direct Drawing (reportlab.pdfgen.canvas): This is the lowest-level interface, offering precise control over every element on the page. You can draw strings, lines, shapes (rectangles, circles, polygons), and embed images at specific coordinates.
2. Higher-Level Document Templating (ReportLab PLATYPUS): For more structured documents with flowing text, tables, and paragraphs, PLATYPUS (Page Layout and TYPography Using Scripts) provides a document templating framework. It handles text wrapping, page breaks, and object positioning automatically.
3. Rich Text and Fonts: Supports various fonts, sizes, colors, and text formatting (bold, italic, underline).
4. Shapes and Graphics: Allows drawing a wide array of geometric shapes and paths with customizable stroke and fill properties.
5. Images: Embeds various image formats (JPEG, PNG).
6. Tables and Charts: Powerful capabilities for generating complex tables and integrating charts (though charts often require external libraries like Matplotlib to render to an image first).
7. Page Management: Handles multiple pages, headers, footers, and page numbering.
Why use ReportLab?
- Automation: Generate thousands of unique PDFs from a database or other data sources without manual intervention.
- Dynamic Content: Create reports where content, layout, and data vary based on input.
- Custom Layouts: Achieve highly specific or branded document designs that might be difficult with simpler tools.
- Integration: Easily integrate PDF generation into existing Python applications or web frameworks.
Basic Workflow (using reportlab.pdfgen.canvas):
1. Import Canvas: Start by importing the `Canvas` class from `reportlab.pdfgen.canvas`.
2. Create Canvas Object: Instantiate a `Canvas` object, providing the desired filename and page size (e.g., `letter`, `A4`) from `reportlab.lib.pagesizes`.
3. Draw Content: Use various methods on the `Canvas` object to add elements:
- `setFont(fontname, size)`: Set the current font.
- `setFillColor(color)`: Set the color for subsequent fills.
- `setStrokeColor(color)`: Set the color for subsequent strokes (lines, borders).
- `drawString(x, y, text)`: Draw a string at specific coordinates.
- `rect(x, y, width, height, stroke=1, fill=0)`: Draw a rectangle.
- `drawImage(image_path, x, y, width, height)`: Embed an image.
4. Save Document: Call the `save()` method on the `Canvas` object to finalize and write the PDF file.
Example Code
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib.colors import blue, green, gray
def create_simple_pdf(filename="my_report.pdf"):
"""
Creates a simple PDF document using ReportLab's canvas API.
"""
c = canvas.Canvas(filename, pagesize=letter)
width, height = letter
Set document title (metadata)
c.setTitle("ReportLab PDF Example")
--- Add a Heading ---
c.setFont("Helvetica-Bold", 28)
c.setFillColor(blue)
Position (x, y) - (0,0) is bottom-left
c.drawString(1 - inch, height - 1.5 - inch, "Dynamic PDF Generation")
--- Add Subheading ---
c.setFont("Helvetica-Bold", 18)
c.setFillColor(green)
c.drawString(1 - inch, height - 2.2 - inch, "Using ReportLab in Python")
--- Add Body Text ---
c.setFont("Helvetica", 12)
c.setFillColor("black")
c.drawString(1 - inch, height - 3 - inch, "ReportLab is a powerful open-source library for creating PDFs programmatically.")
c.drawString(1 - inch, height - 3.2 - inch, "It allows for precise control over text, shapes, images, and layout.")
c.drawString(1 - inch, height - 3.4 - inch, "This example demonstrates basic text and shape drawing on a canvas.")
--- Draw a Rectangle ---
c.setStrokeColor(blue)
c.setLineWidth(1)
c.setFillColor(green, alpha=0.3) Fill with semi-transparent green
c.rect(1 - inch, height - 4.5 - inch, 5 - inch, 1 - inch, stroke=1, fill=1)
c.setFillColor("black")
c.setFont("Helvetica-Oblique", 10)
c.drawString(1.1 - inch, height - 4.2 - inch, "This is a rectangle drawn with custom stroke and fill colors.")
c.drawString(1.1 - inch, height - 4.4 - inch, "Coordinates are relative to the bottom-left corner of the page.")
--- Add a Line ---
c.setStrokeColor(gray)
c.setLineWidth(0.5)
c.line(1 - inch, height - 5.5 - inch, width - 1 - inch, height - 5.5 - inch)
--- Add Page Number ---
c.setFont("Helvetica-Oblique", 9)
c.setFillColor(gray)
c.drawString(width - 1.5 - inch, 0.75 - inch, f"Page 1 of 1")
Save the PDF file
c.save()
print(f"PDF '{filename}' created successfully.")
if __name__ == "__main__":
create_simple_pdf()








PDF Creation with ReportLab