Manipular Tablas en PDF existente
Manipular tablas en un PDF existente
Una de las primeras características soportadas por Aspose.PDF para Python a través de .NET es su capacidad de trabajar con tablas y proporciona un gran soporte para agregar tablas en archivos PDF que se generan desde cero o en cualquier archivo PDF existente. En esta nueva versión, hemos implementado una nueva función de búsqueda y análisis de tablas simples que ya existen en la página de un documento PDF. Una nueva clase llamada TableAbsorber proporciona estas capacidades. El uso de TableAbsorber es muy similar a la clase existente TextFragmentAbsorber. El siguiente fragmento de código muestra los pasos para actualizar contenidos en una celda de tabla en particular.
import aspose.pdf as ap
# Cargar archivo PDF existente
pdf_document = ap.Document(input_file)
# Crear objeto TableAbsorber para encontrar tablas
absorber = ap.text.TableAbsorber()
# Visitar la primera página con el absorber
absorber.visit(pdf_document.pages[1])
# Obtener acceso a la primera tabla en la página, su primera celda y fragmentos de texto en ella
fragment = absorber.table_list[0].row_list[0].cell_list[0].text_fragments[1]
# Cambiar el texto del primer fragmento de texto en la celda
fragment.text = "hola mundo"
pdf_document.save(output_file)
Reemplazar la tabla antigua con una nueva en un documento PDF
En caso de que necesites encontrar una tabla en particular y reemplazarla con la deseada, puedes usar el método replace() de la clase TableAbsorber para hacerlo. El siguiente ejemplo demuestra la funcionalidad para reemplazar la tabla dentro de un documento PDF:
import aspose.pdf as ap
# Cargar documento PDF existente
pdf_document = ap.Document(input_file)
# Crear objeto TableAbsorber para encontrar tablas
absorber = ap.text.TableAbsorber()
# Visitar la primera página con el absorber
absorber.visit(pdf_document.pages[1])
# Obtener la primera tabla en la página
table = absorber.table_list[0]
# Crear nueva tabla
new_table = ap.Table()
new_table.column_widths = "100 100 100"
new_table.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 1)
row = new_table.rows.add()
row.cells.add("Col 1")
row.cells.add("Col 2")
row.cells.add("Col 3")
# Reemplazar la tabla con la nueva
absorber.replace(pdf_document.pages[1], table, new_table)
# Guardar documento
pdf_document.save(output_file)
Cómo determinar si la tabla se romperá en la página actual
Este código genera un documento PDF que contiene una tabla, calcula el espacio disponible en la página y verifica si agregar más filas a la tabla provocará un salto de página basado en las restricciones de espacio. El resultado se guarda en un archivo de salida.
import aspose.pdf as ap
# Instanciar un objeto de la clase PDF
pdf = ap.Document()
# Agregar la sección a la colección de secciones del documento PDF
page = pdf.pages.add()
# Instanciar un objeto de tabla
table1 = ap.Table()
table1.margin.top = 300
# Agregar la tabla en la colección de párrafos de la sección deseada
page.paragraphs.add(table1)
# Establecer los anchos de columna de la tabla
table1.column_widths = "100 100 100"
# Establecer el borde de celda predeterminado usando el objeto BorderInfo
table1.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.1)
# Establecer el borde de la tabla usando otro objeto BorderInfo personalizado
table1.border = ap.BorderInfo(ap.BorderSide.ALL, 1)
# Crear objeto MarginInfo y establecer sus márgenes izquierdo, inferior, derecho y superior
margin = ap.MarginInfo()
margin.top = 5
margin.left = 5
margin.right = 5
margin.bottom = 5
# Establecer el relleno de celda predeterminado en el objeto MarginInfo
table1.default_cell_padding = margin
# Si incrementas el contador a 17, la tabla se romperá
# Porque no puede ser acomodada más en esta página
for row_counter in range(0, 17):
# Crear filas en la tabla y luego celdas en las filas
row1 = table1.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")
# Obtener la información de altura de la página
page_height = pdf.page_info.height
# Obtener la información de altura total del margen superior e inferior de la página,
# margen superior de la tabla y altura de la tabla.
total_objects_height = page.page_info.margin.top + page.page_info.margin.bottom + table1.margin.top + \
table1.get_height(None)
# Mostrar información de altura de la página, altura de la tabla, margen superior de la tabla y
# información del margen superior e inferior de la página
print("Altura del documento PDF = " + str(pdf.page_info.height) + "\nInformación del margen superior = " + str(page.page_info.margin.top)
+ "\nInformación del margen inferior = " + str(page.page_info.margin.bottom) + "\n\nInformación del margen superior de la tabla = "
+ str(table1.margin.top) + "\nAltura promedio de fila = " + str(table1.rows[0].min_row_height) + " \nAltura de la tabla "
+ str(table1.get_height(None)) + "\n ----------------------------------------" + "\nAltura total de la página ="
+ str(page_height) + "\nAltura acumulada incluyendo la tabla =" + str(total_objects_height))
# Verificar si al restar la suma del margen superior de la página + margen inferior de la página
# + margen superior de la tabla y altura de la tabla de la altura de la página es menor
# A 10 (una fila promedio puede ser mayor a 10)
if (page_height - total_objects_height) <= 10:
# Si el valor es menor a 10, entonces mostrar el mensaje.
# Que muestra que no se puede colocar otra fila y si agregamos una nueva
# Fila, la tabla se romperá. Depende del valor de la altura de la fila.
print("Altura de la página - Altura de los objetos < 10, por lo que la tabla se romperá")
# Guardar el documento PDF
pdf.save(output_file)
Añadir Columna Repetida en la Tabla
En la clase Aspose.Pdf.Table, puede establecer un repeating_rows_count que repetirá filas si la tabla es demasiado larga verticalmente y se desborda a la siguiente página. Sin embargo, en algunos casos, las tablas son demasiado anchas para caber en una sola página y necesitan continuar en la siguiente página. Para cumplir con el propósito, hemos implementado la propiedad repeating_columns_count en la clase Aspose.Pdf.Table. Establecer esta propiedad hará que la tabla se divida a la siguiente página en columnas y repita el número de columnas dado al inicio de la siguiente página. El siguiente fragmento de código muestra el uso de la propiedad repeating_columns_count:
import aspose.pdf as ap
# Crear un nuevo documento
doc = ap.Document()
page = doc.pages.add()
# Instanciar una tabla externa que ocupa toda la página
outer_table = ap.Table()
outer_table.column_widths = "100%"
outer_table.horizontal_alignment = ap.HorizontalAlignment.LEFT
# Instanciar un objeto de tabla que se anidará dentro de outerTable que se romperá dentro de la misma página
my_table = ap.Table()
my_table.broken = ap.TableBroken.VERTICAL_IN_SAME_PAGE
my_table.column_adjustment = ap.ColumnAdjustment.AUTO_FIT_TO_CONTENT
# Agregar outerTable a los párrafos de la página
# Agregar mi tabla a outerTable
page.paragraphs.add(outer_table)
body_row = outer_table.rows.add()
body_cell = body_row.cells.add()
body_cell.paragraphs.add(my_table)
my_table.repeating_columns_count = 5
page.paragraphs.add(my_table)
# Agregar fila de encabezado
row = my_table.rows.add()
row.cells.add("encabezado 1")
row.cells.add("encabezado 2")
row.cells.add("encabezado 3")
row.cells.add("encabezado 4")
row.cells.add("encabezado 5")
row.cells.add("encabezado 6")
row.cells.add("encabezado 7")
row.cells.add("encabezado 11")
row.cells.add("encabezado 12")
row.cells.add("encabezado 13")
row.cells.add("encabezado 14")
row.cells.add("encabezado 15")
row.cells.add("encabezado 16")
row.cells.add("encabezado 17")
for row_counter in range(0, 6):
# Crear filas en la tabla y luego celdas en las filas
row1 = my_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) + ", 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")
doc.save(output_file)