Add Tables to PDF in Python
Adding tables to existing PDF documents is a common requirement for data presentation, structured content, and reporting. Aspose.PDF for Python via .NET provides a practical API for inserting and formatting tables in existing PDFs.
This guide provides step-by-step examples for table creation, column sizing, borders, rows and cells, and saving the modified document. It also covers advanced options such as cell borders, margins, padding, and AutoFit settings for dynamic table sizing.
Use this page when you need to add new tables to existing PDFs and control their layout behavior in Python.
Creating Basic Tables
Creating Table
This example demonstrates how to create a Table in a PDF document with borders and multiple rows.
- Create a new PDF document.
- Adds a blank page to the document.
- Initialize the Table.
- Set the overall table border.
- Set the border for individual cells.
- Add Rows and Cells.
- Insert the table into the page.
- Save the PDF to the specified path.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def create_table(outfile: str) -> None:
# Create new PDF document
document = ap.Document()
page = document.pages.add()
# Initializes a new instance of the Table
table = ap.Table()
# Set the table border color as LightGray
table.border = ap.BorderInfo(ap.BorderSide.ALL, 5, ap.Color.light_gray)
# Set the border for table cells
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 5, ap.Color.light_gray)
# Create a loop to add 10 rows
for row_count in range(10):
# Add row to table
row = table.rows.add()
# Add table cells
row.cells.add("Column (" + str(row_count) + ", 1)")
row.cells.add("Column (" + str(row_count) + ", 2)")
row.cells.add("Column (" + str(row_count) + ", 3)")
# Add table object to first page of input document
page.paragraphs.add(table)
# Save updated document containing table object
document.save(outfile)
Adding Images to Table cells
This code snippet shows how to insert images into Table cells in a PDF document.
- Create a new PDF document.
- Initialize the Table.
- Set column widths in points.
- A text fragment is added to the first cell.
- An ‘ap.Image()’ instance is added to the second cell.
- Set the path to the image file with ‘img.file’.
- The ‘img.fix_width’ and ‘img.fix_height’ control the image size inside the cell.
- Insert the Table into the PDF page.
- Save the PDF.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_image(image: str, outfile: str) -> None:
# Instantiate Document object
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
table = ap.Table()
# Set width for table cells
table.column_widths = "200 100"
# Create row object and add it to table instance
row = table.rows.add()
# Create cell object and add it to row instance
cell = row.cells.add()
# Add textfragment to paragraphs collection of cell object
cell.paragraphs.add(ap.text.TextFragment(image))
# Create an image instance
img = ap.Image()
# Set image type as SVG
# Path for source file
img.file = image
# Set width for image instance
img.fix_width = 50
# Set height for image instance
img.fix_height = 50
# Add another cell to row object
cell = row.cells.add()
# Add SVG image to paragraphs collection of recently added cell instance
cell.paragraphs.add(img)
# Add table to paragraphs collection of page object
page.paragraphs.add(table)
# Save PDF file
document.save(outfile)
You can add SVG images into table cells in a PDF document:
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_svg_image(images: list[str], outfile: str) -> None:
# Instantiate Document object
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
table = ap.Table()
# Set width for table cells
table.column_widths = "200 100"
for image in images:
# Create row object and add it to table instance
row = table.rows.add()
# Create cell object and add it to row instance
cell = row.cells.add()
# Add textfragment to paragraphs collection of cell object
cell.paragraphs.add(ap.text.TextFragment(image))
# Create an image instance
img = ap.Image()
# Set image type as SVG
img.file_type = ap.ImageFileType.SVG
# Path for source file
img.file = image
# Set width for image instance
img.fix_width = 50
# Set height for image instance
img.fix_height = 50
# Add another cell to row object
cell = row.cells.add()
# Add SVG image to paragraphs collection of recently added cell instance
cell.paragraphs.add(img)
# Add table to paragraphs collection of page object
page.paragraphs.add(table)
# Save PDF file
document.save(outfile)
ColSpan and RowSpan in Tables
This example shows how to merge table cells vertically and horizontally to create complex table layouts.
- Set the overall table border.
- Set the default cell borders.
- Merge two cells horizontally into one.
- Merge the cell vertically across two rows.
- Row 5 accounts for the rowspan by skipping the merged column.
- Insert the table into the page.
- Save the PDF.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_rowspan_or_colspan(outfile: str) -> None:
# Create new PDF document
document = ap.Document()
page = document.pages.add()
# Initializes a new instance of the Table
table = ap.Table()
# Set the table border color as LightGray
table.border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, ap.Color.black)
# Set the border for table cells
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, ap.Color.black)
# Add 1st row to table
row1 = table.rows.add()
for cell_count in range(1, 5):
# Add table cells
row1.cells.add("Test 1" + str(cell_count))
# Add 2nd row to table
row2 = table.rows.add()
row2.cells.add("Test 2 1")
cell = row2.cells.add("Test 2 2")
cell.col_span = 2
row2.cells.add("Test 2 4")
# Add 3rd row to table
row3 = table.rows.add()
row3.cells.add("Test 3 1")
row3.cells.add("Test 3 2")
row3.cells.add("Test 3 3")
row3.cells.add("Test 3 4")
# Add 4th row to table
row4 = table.rows.add()
row4.cells.add("Test 4 1")
cell = row4.cells.add("Test 4 2")
cell.row_span = 2
row4.cells.add("Test 4 3")
row4.cells.add("Test 4 4")
# Add 5th row to table
row5 = table.rows.add()
row5.cells.add("Test 5 1")
row5.cells.add("Test 5 3")
row5.cells.add("Test 5 4")
# Add table object to first page of input document
page.paragraphs.add(table)
# Save updated document containing table object
document.save(outfile)

Applying Borders to Tables and Cells
This example shows how to set cell padding, table margins, and control word wrapping for text in table cells.
- Set the widths of the columns.
- Define the table and cell borders.
- Set padding Inside cells for consistent spacing.
- Apply the padding to all cells by default.
- Add Text and Controlling Wrapping.
- Add Rows and Cells.
- Save the PDF.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_borders(outfile: str) -> None:
# Create new PDF document
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
tab1 = ap.Table()
# Add the table in paragraphs collection of the desired section
page.paragraphs.add(tab1)
# Set with column widths of the table
tab1.column_widths = "50 50 50"
# Set default cell border using BorderInfo object
tab1.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.1)
# Set table border using another customized BorderInfo object
tab1.border = ap.BorderInfo(ap.BorderSide.ALL, 1)
# Create MarginInfo object and set its left, bottom, right and top margins
margin = ap.MarginInfo()
margin.top = 5
margin.left = 5
margin.right = 5
margin.bottom = 5
# Set the default cell padding to the MarginInfo object
tab1.default_cell_padding = margin
# Create rows in the table and then cells in the rows
row1 = tab1.rows.add()
row1.cells.add("col1")
row1.cells.add("col2")
row1.cells.add()
text = ap.text.TextFragment("col3 with large text string")
row1.cells[2].paragraphs.add(text)
row1.cells[2].is_word_wrapped = False
row2 = tab1.rows.add()
row2.cells.add("item1")
row2.cells.add("item2")
row2.cells.add("item3")
# Save updated document containing table object
document.save(outfile)

Table Layout and Sizing
Auto-fitting columns and rows
This code snippet shows how to automatically adjust table column widths to fit the page. Please note that in the parameter table.column_widths = “50 50 50” - its points. But you can also specify centimeters (cm), inch or %.
- Set initial column widths.
- Automatically adjusts columns to fit the page width.
- Define cell and table borders.
- The ’table.default_cell_padding’ uses ‘MarginInfo()’ for consistent spacing inside cells.
- Add Rows with ’table.rows.add()’, and add Cells with ‘row.cells.add()’.
- Save the PDF.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def auto_fit(outfile: str) -> None:
# Create new PDF document
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
table = ap.Table()
page.paragraphs.add(table)
table.column_widths = "50 50 50"
table.column_adjustment = ap.ColumnAdjustment.AUTO_FIT_TO_WINDOW
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.1)
table.border = ap.BorderInfo(ap.BorderSide.ALL, 1)
margin = ap.MarginInfo()
margin.top = 5
margin.left = 5
margin.right = 5
margin.bottom = 5
table.default_cell_padding = margin
row1 = table.rows.add()
row1.cells.add("col1")
row1.cells.add("col2")
row1.cells.add("col3")
row2 = table.rows.add()
row2.cells.add("item1")
row2.cells.add("item2")
row2.cells.add("item3")
document.save(outfile)
Create Complex PDF Tables with Merged Cells and Repeating Columns
Build an advanced table in a PDF using Python and Aspose.PDF. It includes merged header cells, colored backgrounds, repeating columns, and a large structured dataset. The table is configured to handle vertical breaking and complex layouts for report-style documents.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_table_hide_borders(outfile: str) -> None:
# Create PDF document
document = ap.Document()
page = document.pages.add()
# Instantiate a table object that will be nested inside outerTable that will break inside the same page
table = ap.Table()
table.broken = ap.TableBroken.VERTICAL
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL)
table.repeating_columns_count = 2
page.paragraphs.add(table)
# Add header Row
row = table.rows.add()
cell = row.cells.add("header 1")
cell.col_span = 2
cell.background_color = ap.Color.light_gray
row.cells.add("header 3")
cell2 = row.cells.add("header 4")
cell2.col_span = 2
cell2.background_color = ap.Color.light_blue
row.cells.add("header 6")
cell3 = row.cells.add("header 7")
cell3.col_span = 2
cell3.background_color = ap.Color.light_green
cell4 = row.cells.add("header 9")
cell4.col_span = 3
cell4.background_color = ap.Color.light_coral
row.cells.add("header 12")
row.cells.add("header 13")
row.cells.add("header 14")
row.cells.add("header 15")
row.cells.add("header 16")
row.cells.add("header 17")
row_counter = 0
while row_counter < 3:
# Create rows in the table and then cells in the rows
row1 = table.rows.add()
row1.cells.add("col " + str(row_counter) + ", 1")
row1.cells.add("col " + str(row_counter) + ", 2")
row1.cells.add("col " + str(row_counter) + ", 3")
row1.cells.add("col " + str(row_counter) + ", 4")
row1.cells.add("col " + str(row_counter) + ", 5")
row1.cells.add("col " + str(row_counter) + ", 6")
row1.cells.add("col " + str(row_counter) + ", 7")
row1.cells.add("col " + str(row_counter) + ", 8")
row1.cells.add("col " + str(row_counter) + ", 9")
row1.cells.add("col " + str(row_counter) + ", 10")
row1.cells.add("col " + str(row_counter) + ", 11")
row1.cells.add("col " + str(row_counter) + ", 12")
row1.cells.add("col " + str(row_counter) + ", 13")
row1.cells.add("col " + str(row_counter) + ", 14")
row1.cells.add("col " + str(row_counter) + ", 15")
row1.cells.add("col " + str(row_counter) + ", 16")
row1.cells.add("col " + str(row_counter) + ", 17")
row_counter += 1
document.save(outfile)

Styling Table Corners
Aspose.PDF for Python via .NET shows how to apply rounded corners to a table and customize the border radius.
- Create a new table instance.
- Initialize a border for all sides.
- Set the corner radius.
- Apply the rounded corner style.
- Add Rows and Cells.
- Insert the table into the PDF page with ‘page.paragraphs.add(table)’.
- Save the PDF document.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def create_table_with_round_corner(outfile: str) -> None:
# Create new PDF document
document = ap.Document()
page = document.pages.add()
# Create a table
table = ap.Table()
# Create a blank BorderInfo object
b_info = ap.BorderInfo(ap.BorderSide.ALL)
# Set the border a rounded border where radius of round is 15
b_info.rounded_border_radius = 15
# Set the table corner style as Round
table.corner_style = ap.BorderCornerStyle.ROUND
# Set the table border information
table.border = b_info
# Create a loop to add 10 rows
for row_count in range(0, 10):
# Add row to table
row = table.rows.add()
# Add table cells
row.cells.add("Column (" + str(row_count) + ", 1)")
row.cells.add("Column (" + str(row_count) + ", 2)")
row.cells.add("Column (" + str(row_count) + ", 3)")
# Add table object to first page of input document
page.paragraphs.add(table)
# Save updated document containing table object
document.save(outfile)
Adding Content to Tables
Using HTML Fragments in Cells
This example shows how to insert HTML-formatted content into table cells.
- Define table and cell borders.
- Add HTML content.
- Add Rows. A loop adds multiple rows with HTML-formatted content in each cell.
- Insert the table into the PDF page with ‘page.paragraphs.add(table)’.
- Save the PDF document.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_html_fragments(outfile: str) -> None:
# Instantiate Document object
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
table = ap.Table()
# Set the table border color as LightGray
table.border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, ap.Color.light_gray)
# Set the border for table cells
table.default_cell_border = ap.BorderInfo(
ap.BorderSide.ALL, 0.5, ap.Color.light_gray
)
# Create a loop to add 10 rows
row_count = 1
while row_count < 10:
# Add row to table
row = table.rows.add()
# Add table cells
cell = row.cells.add()
cell.paragraphs.add(
ap.HtmlFragment(f"Column <strong>({row_count}, 1)</strong>")
)
cell = row.cells.add()
cell.paragraphs.add(
ap.HtmlFragment(f"Column <span style='color:red'>({row_count}, 2)</span>")
)
cell = row.cells.add()
cell.paragraphs.add(
ap.HtmlFragment(
f"Column <span style='text-decoration: underline'>({row_count}, 3)</span>"
)
)
row_count += 1
# Add table object to first page of input document
page.paragraphs.add(table)
# Save updated document containing table object
document.save(outfile)
Using LaTeX Fragments in Cells
This example shows how to insert LaTeX-formatted content into table cells for mathematical or styled expressions.
- Define table and cell borders.
- Add LaTeX Content.
- Add Rows. A loop adds multiple rows with LaTeX-formatted content in each cell.
- Insert the table into the PDF page with ‘page.paragraphs.add(table)’.
- Save the PDF document.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_latex_fragments(outfile: str) -> None:
# Instantiate Document object
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
table = ap.Table()
# Set the table border color as LightGray
table.border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, ap.Color.light_gray)
# Set the border for table cells
table.default_cell_border = ap.BorderInfo(
ap.BorderSide.ALL, 0.5, ap.Color.light_gray
)
# Create a loop to add 10 rows
row_count = 1
while row_count < 10:
# Add row to table
row = table.rows.add()
# Add table cells
cell = row.cells.add()
cell.paragraphs.add(ap.LatexFragment(f"Column $\\mathbf{{({row_count}, 1)}}$"))
cell = row.cells.add()
cell.paragraphs.add(
ap.LatexFragment(f"Column $\\textcolor{{red}}{{({row_count}, 2)}}$")
)
cell = row.cells.add()
cell.paragraphs.add(
ap.LatexFragment(f"Column $\\underline{{({row_count}, 3)}}$")
)
row_count += 1
# Add table object to first page of input document
page.paragraphs.add(table)
# Save updated document containing table object
document.save(outfile)
Advanced Table Features
Insert Automatic Page Breaks in a PDF Table
Create a large table in a PDF using Python and Aspose.PDF, with automatic page breaks after a specific number of rows. It builds a multi-row table, applies borders, and forces selected rows to begin on a new page for better layout control.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def insert_page_break(outfile: str) -> None:
# Create PDF document
document = ap.Document()
# Add page
page = document.pages.add()
# Create table instance
table = ap.Table()
# Set border style for table
table.border = ap.BorderInfo(ap.BorderSide.ALL, ap.Color.red)
# Set default border style for table with border color as Red
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, ap.Color.red)
# Specify table columns width
table.column_widths = "100 100"
# Create a loop to add 200 rows for table
for counter in range(201):
row = ap.Row()
table.rows.add(row)
cell1 = ap.Cell()
cell1.paragraphs.add(ap.text.TextFragment(f"Cell {counter}, 0"))
row.cells.add(cell1)
cell2 = ap.Cell()
cell2.paragraphs.add(ap.text.TextFragment(f"Cell {counter}, 1"))
row.cells.add(cell2)
# When 10 rows are added, render new row in new page
if counter % 10 == 0 and counter != 0:
row.is_in_new_page = True
# Add table to paragraphs collection of PDF file
page.paragraphs.add(table)
# Save PDF document
document.save(outfile)
Repeating Header rows on multiple Pages
This example shows how to create a table that spans multiple pages while keeping header rows visible on each page.
- Initialize the Table.
- Repeat Header Rows including font, size, and color.
- Set Column Widths and apply Borders to the table.
- Add Header rows.
- Add many data rows to force table across multiple pages.
- Insert the table into the PDF page with ‘page.paragraphs.add(table)’.
- Save the PDF document.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_repeating_rows(outfile: str) -> None:
# Create PDF document
document = ap.Document()
page = document.pages.add()
# Instantiate a table object
table = ap.Table()
# Set the table to break across pages
table.broken = ap.TableBroken.VERTICAL
# Set number of repeating header rows
table.repeating_rows_count = 2
text_state = ap.text.TextState()
text_state.font_size = 12
text_state.font = ap.text.FontRepository.find_font("TimesNewRoman")
text_state.foreground_color = ap.Color.red
table.repeating_rows_style = text_state
# Set column widths
table.column_widths = "100 100 100"
# Set borders
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, ap.Color.black)
table.border = ap.BorderInfo(ap.BorderSide.ALL, 1, ap.Color.black)
# Add header rows that will repeat on each page
header_row1 = table.rows.add()
header_row1.cells.add("Header 1-1")
header_row1.cells.add("Header 1-2")
header_row1.cells.add("Header 1-3")
# Set background color for header rows
for cell in header_row1.cells:
cell.background_color = ap.Color.light_gray
header_row2 = table.rows.add()
header_row2.cells.add("Header 2-1")
header_row2.cells.add("Header 2-2")
header_row2.cells.add("Header 2-3")
for cell in header_row2.cells:
cell.background_color = ap.Color.light_blue
# Add many data rows to force table across multiple pages
for i in range(1, 101):
row = table.rows.add()
row.cells.add(f"Data {i}-1")
row.cells.add(f"Data {i}-2")
row.cells.add(f"Data {i}-3")
# Add table to page
page.paragraphs.add(table)
# Save document
document.save(outfile)
Repeating Columns
The function ‘add_repeating_columns’ creates a PDF document with a table that has repeating columns. It sets up a bordered table, adds headers, fills in data rows, and saves the generated PDF file to the specified location. Setting this property will cause the table to break to the next page column-wise and repeat the given column count at the start of the next page.
- Initializes a new PDF document.
- Adds a page with custom dimensions.
- Set Table Border Style.
- Initialize Table.
- Add table to the PDF page.
- Add header row.
- Add data rows.
- Save PDF Document.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def add_repeating_columns(outfile: str) -> None:
# Create PDF document
document = ap.Document()
# Add page
page = document.pages.add()
page.set_page_size(ap.PageSize.a5.height, ap.PageSize.a5.width)
# Define border
border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, ap.Color.light_gray)
# Create table
table = ap.Table()
table.broken = ap.TableBroken.VERTICAL_IN_SAME_PAGE
table.column_adjustment = ap.ColumnAdjustment.AUTO_FIT_TO_CONTENT
table.repeating_columns_count = 5
table.border = border
table.default_cell_border = border
# Add table to page
page.paragraphs.add(table)
# Add header row
row = table.rows.add()
for i in range(1, 6):
cell = row.cells.add(f"header {i}")
cell.background_color = ap.Color.light_gray
for i in range(6, 18):
row.cells.add(f"header {i}")
# Add data rows
for row_counter in range(1, 6):
row = table.rows.add()
for i in range(1, 6):
cell = row.cells.add(f"cell {row_counter},{i}")
cell.background_color = ap.Color.light_gray
for i in range(6, 18):
row.cells.add(f"cell {row_counter},{i}")
# Save PDF document
document.save(outfile)
Create a PDF Table with Rotated Text Cells
Create a table in a PDF using Python and Aspose.PDF with text rotated at different angles inside each cell. It is useful for vertical headers, creative layouts, compact tables, and custom report formatting.
import aspose.pdf as ap
from aspose.pdf import Color, HorizontalAlignment
from os import path
import sys
def rotated_text_table(outfile: str) -> None:
# Create PDF document
document = ap.Document()
# Add page
page = document.pages.add()
# Initializes a new instance of the Table
table = ap.Table()
table.border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, Color.black)
table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.5, Color.black)
# Add 1st row to table
row1 = table.rows.add()
row1.min_row_height = 200
for cell_count in range(4):
# Add table cells
cell = row1.cells.add()
tf = ap.text.TextFragment(f"Cell 1 {cell_count - 1}")
tf.text_state.rotation = 90 * cell_count
tf.horizontal_alignment = HorizontalAlignment.CENTER
cell.paragraphs.add(tf)
# Add table object to first page of input document
page.paragraphs.add(table)
# Save result
document.save(outfile)