Agregar tablas a PDF en Python
Agregar tablas a documentos PDF existentes es un requisito común para la presentación de datos, contenido estructurado y generación de informes. Aspose.PDF for Python via .NET proporciona una API práctica para insertar y formatear tablas en PDFs existentes.
Esta guía ofrece ejemplos paso a paso para la creación de tablas, el dimensionado de columnas, bordes, filas y celdas, y la guardado del documento modificado. También cubre opciones avanzadas como bordes de celdas, márgenes, relleno y configuraciones AutoFit para el dimensionado dinámico de tablas.
Utilice esta página cuando necesite agregar nuevas tablas a PDFs existentes y controlar su comportamiento de diseño en Python.
Creando tablas básicas
Creando tabla
Este ejemplo muestra cómo crear una Tabla en un documento PDF con bordes y varias filas.
- Crear un nuevo documento PDF.
- Agrega una página en blanco al documento.
- Inicializar la tabla.
- Establecer el borde general de la tabla.
- Establece el borde para celdas individuales.
- Agregar filas y celdas.
- Inserte la tabla en la página.
- Guarde el PDF en la ruta especificada.
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)
Agregar imágenes a las celdas de la tabla
Este fragmento de código muestra cómo insertar imágenes en celdas de tabla en un documento PDF.
- Crear un nuevo documento PDF.
- Inicializar la tabla.
- Establecer anchos de columna en puntos.
- Se agrega un fragmento de texto a la primera celda.
- Se agrega una instancia de ‘ap.Image()’ a la segunda celda.
- Establezca la ruta al archivo de imagen con ‘img.file’.
- Los ‘img.fix_width’ y ‘img.fix_height’ controlan el tamaño de la imagen dentro de la celda.
- Inserte la tabla en la página PDF.
- Guardar el 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)
Puedes agregar imágenes SVG en celdas de tabla en un documento PDF:
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 y RowSpan en Tablas
Este ejemplo muestra cómo fusionar celdas de tabla vertical y horizontalmente para crear diseños de tabla complejos.
- Establecer el borde general de la tabla.
- Establecer los bordes predeterminados de la celda.
- Combina dos celdas horizontalmente en una.
- Combinar la celda verticalmente a lo largo de dos filas.
- La fila 5 tiene en cuenta el rowspan omitiendo la columna fusionada.
- Inserte la tabla en la página.
- Guardar el 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)

Aplicando bordes a tablas y celdas
Este ejemplo muestra cómo establecer el relleno de celdas, los márgenes de la tabla y controlar el ajuste de línea del texto en las celdas de la tabla.
- Establezca los anchos de las columnas.
- Definir los bordes de la tabla y de las celdas.
- Establecer relleno dentro de las celdas para un espaciado consistente.
- Aplica el relleno a todas las celdas por defecto.
- Agregar texto y controlar el ajuste.
- Agregar filas y celdas.
- Guardar el 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)

Diseño y dimensionamiento de la tabla
Ajuste automático de columnas y filas
Este fragmento de código muestra cómo ajustar automáticamente el ancho de las columnas de la tabla para que encajen en la página. Tenga en cuenta que en el parámetro table.column_widths = “50 50 50” - son puntos. Pero también puede especificar centímetros (cm), pulgadas o %.
- Establecer anchos de columna iniciales.
- Ajusta automáticamente las columnas al ancho de la página.
- Definir bordes de celda y tabla.
- El ’table.default_cell_padding’ usa ‘MarginInfo()’ para un espaciado consistente dentro de las celdas.
- Agregar filas con ’table.rows.add()’, y agregar celdas con ‘row.cells.add()’.
- Guardar el 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)
Crear tablas PDF complejas con celdas combinadas y columnas repetidas
Construye una tabla avanzada en un PDF usando Python y Aspose.PDF. Incluye celdas de encabezado combinadas, fondos de color, columnas repetidas y un gran conjunto de datos estructurado. La tabla está configurada para manejar rupturas verticales y diseños complejos para documentos tipo informe.
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)

Estilizando esquinas de tabla
Aspose.PDF for Python via .NET muestra cómo aplicar esquinas redondeadas a una tabla y personalizar el radio del borde.
- Crea una nueva instancia de tabla.
- Inicializa un borde para todos los lados.
- Establecer el radio de la esquina.
- Aplicar el estilo de esquina redondeada.
- Agregar filas y celdas.
- Inserte la tabla en la página PDF con ‘page.paragraphs.add(table)’.
- Guarde el documento PDF.
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)
Agregar contenido a tablas
Uso de fragmentos HTML en celdas
Este ejemplo muestra cómo insertar contenido con formato HTML en celdas de tabla.
- Definir bordes de tabla y celda.
- Agregar contenido HTML.
- Agregar filas. Un bucle agrega varias filas con contenido con formato HTML en cada celda.
- Inserte la tabla en la página PDF con ‘page.paragraphs.add(table)’.
- Guarde el documento PDF.
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)
Uso de fragmentos LaTeX en celdas
Este ejemplo muestra cómo insertar contenido formateado en LaTeX en celdas de tabla para expresiones matemáticas o con estilo.
- Definir bordes de tabla y celda.
- Agregar contenido LaTeX.
- Agregar filas. Un bucle agrega varias filas con contenido formateado en LaTeX en cada celda.
- Inserte la tabla en la página PDF con ‘page.paragraphs.add(table)’.
- Guarde el documento PDF.
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)
Funciones avanzadas de tabla
Insertar saltos de página automáticos en una tabla PDF
Crear una tabla grande en un PDF usando Python y Aspose.PDF, con saltos de página automáticos después de un número específico de filas. Construye una tabla de varias filas, aplica bordes y fuerza que filas seleccionadas comiencen en una nueva página para un mejor control del diseño.
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)
Filas de encabezado repetidas en varias páginas
Este ejemplo muestra cómo crear una tabla que se extienda a varias páginas mientras se mantiene visible la fila de encabezado en cada página.
- Inicializar la tabla.
- Repetir filas de encabezado incluyendo fuente, tamaño y color.
- Establecer anchos de columna y aplicar bordes a la tabla.
- Agregar filas de encabezado.
- Agrega muchas filas de datos para forzar que la tabla se extienda a varias páginas.
- Inserte la tabla en la página PDF con ‘page.paragraphs.add(table)’.
- Guarde el documento PDF.
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)
Columnas repetidas
La función ‘add_repeating_columns’ crea un documento PDF con una tabla que tiene columnas repetidas. Configura una tabla con bordes, añade encabezados, rellena filas de datos y guarda el archivo PDF generado en la ubicación especificada. Establecer esta propiedad hará que la tabla se rompa a la siguiente página por columnas y repita el número de columnas indicado al inicio de la siguiente página.
- Inicializa un nuevo documento PDF.
- Agrega una página con dimensiones personalizadas.
- Establecer estilo de borde de tabla.
- Inicializar Tabla.
- Agregar tabla a la página PDF.
- Agregar fila de encabezado.
- Agregar filas de datos.
- Guardar documento PDF.
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)
Crear una tabla PDF con celdas de texto rotado
Crea una tabla en un PDF usando Python y Aspose.PDF con texto rotado en diferentes ángulos dentro de cada celda. Es útil para encabezados verticales, diseños creativos, tablas compactas y formato personalizado de informes.
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)