Manipular Tabelas em PDF existente
Manipular tabelas em PDF existente
Uma das primeiras funcionalidades suportadas pelo Aspose.PDF para Python via .NET é a sua capacidade de Trabalhar com Tabelas e fornece ótimo suporte para adicionar tabelas em arquivos PDF sendo gerados do zero ou em qualquer arquivo PDF existente. Nesta nova versão, implementamos uma nova funcionalidade de pesquisa e análise de tabelas simples que já existem na página de um documento PDF. Uma nova classe chamada TableAbsorber fornece essas capacidades. O uso do TableAbsorber é muito semelhante à classe existente TextFragmentAbsorber. O trecho de código a seguir mostra as etapas para atualizar o conteúdo em uma célula específica da tabela.
import aspose.pdf as ap
# Carregar arquivo PDF existente
pdf_document = ap.Document(input_file)
# Criar objeto TableAbsorber para encontrar tabelas
absorber = ap.text.TableAbsorber()
# Visitar a primeira página com o absorvedor
absorber.visit(pdf_document.pages[1])
# Obter acesso à primeira tabela na página, sua primeira célula e fragmentos de texto nela
fragment = absorber.table_list[0].row_list[0].cell_list[0].text_fragments[1]
# Alterar o texto do primeiro fragmento de texto na célula
fragment.text = "olá mundo"
pdf_document.save(output_file)
Substituir tabela antiga por uma nova em documento PDF
Caso você precise encontrar uma tabela específica e substituí-la pela desejada, você pode usar o método replace() da classe TableAbsorber para fazer isso. O exemplo a seguir demonstra a funcionalidade de substituir a tabela dentro de um documento PDF:
import aspose.pdf as ap
# Carregar documento PDF existente
pdf_document = ap.Document(input_file)
# Criar objeto TableAbsorber para encontrar tabelas
absorber = ap.text.TableAbsorber()
# Visitar a primeira página com o absorvedor
absorber.visit(pdf_document.pages[1])
# Obter a primeira tabela na página
table = absorber.table_list[0]
# Criar nova tabela
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")
# Substituir a tabela pela nova
absorber.replace(pdf_document.pages[1], table, new_table)
# Salvar documento
pdf_document.save(output_file)
Como determinar se a tabela vai quebrar na página atual
Este código gera um documento PDF contendo uma tabela, calcula o espaço disponível na página e verifica se adicionar mais linhas à tabela levará a uma quebra de página com base nas restrições de espaço. O resultado é salvo em um arquivo de saída.
import aspose.pdf as ap
# Instanciar um objeto da classe PDF
pdf = ap.Document()
# Adicionar a seção à coleção de seções do documento PDF
page = pdf.pages.add()
# Instanciar um objeto de tabela
table1 = ap.Table()
table1.margin.top = 300
# Adicionar a tabela na coleção de parágrafos da seção desejada
page.paragraphs.add(table1)
# Definir as larguras das colunas da tabela
table1.column_widths = "100 100 100"
# Definir borda de célula padrão usando o objeto BorderInfo
table1.default_cell_border = ap.BorderInfo(ap.BorderSide.ALL, 0.1)
# Definir borda da tabela usando outro objeto BorderInfo personalizado
table1.border = ap.BorderInfo(ap.BorderSide.ALL, 1)
# Criar objeto MarginInfo e definir suas margens esquerda, inferior, direita e superior
margin = ap.MarginInfo()
margin.top = 5
margin.left = 5
margin.right = 5
margin.bottom = 5
# Definir o preenchimento de célula padrão para o objeto MarginInfo
table1.default_cell_padding = margin
# Se você aumentar o contador para 17, a tabela irá quebrar
# Porque não pode ser acomodada mais nesta página
for row_counter in range(0, 17):
# Criar linhas na tabela e depois células nas linhas
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")
# Obter a informação de altura da página
page_height = pdf.page_info.height
# Obter a informação total de altura das margens superior e inferior da página,
# Margem superior da tabela e altura da tabela.
total_objects_height = page.page_info.margin.top + page.page_info.margin.bottom + table1.margin.top + \
table1.get_height(None)
# Exibir a altura da página, altura da tabela, margem superior da tabela e
# Informações sobre as margens superior e inferior da página
print("Altura do documento PDF = " + str(pdf.page_info.height) + "\nInformação da Margem Superior = " + str(page.page_info.margin.top)
+ "\nInformação da Margem Inferior = " + str(page.page_info.margin.bottom) + "\n\nInformação da Margem Superior da Tabela = "
+ str(table1.margin.top) + "\nAltura Média da Linha = " + str(table1.rows[0].min_row_height) + " \nAltura da Tabela "
+ str(table1.get_height(None)) + "\n ----------------------------------------" + "\nAltura Total da Página ="
+ str(page_height) + "\nAltura cumulativa incluindo a Tabela =" + str(total_objects_height))
# Verificar se subtrairmos a soma da margem superior da página + margem inferior da página
# + Margem superior da tabela e altura da tabela da altura da página e é menor
# Que 10 (uma linha média pode ser maior que 10)
if (page_height - total_objects_height) <= 10:
# Se o valor for menor que 10, então exibir a mensagem.
# Que mostra que outra linha não pode ser colocada e se adicionarmos uma nova
# Linha, a tabela irá quebrar. Isso depende do valor da altura da linha.
print("Altura da Página - Altura dos Objetos < 10, então a tabela irá quebrar")
# Salvar o documento PDF
pdf.save(output_file)
Adicionar Coluna Repetida na Tabela
Na classe Aspose.Pdf.Table, você pode definir um repeating_rows_count que repetirá linhas se a tabela for muito longa verticalmente e transbordar para a próxima página. No entanto, em alguns casos, as tabelas são muito largas para caber em uma única página e precisam ser continuadas na próxima página. Para atender a esse propósito, implementamos a propriedade repeating_columns_count na classe Aspose.Pdf.Table. Definir essa propriedade fará com que a tabela quebre para a próxima página em colunas e repita a contagem de colunas especificada no início da próxima página. O trecho de código a seguir mostra o uso da propriedade repeating_columns_count:
import aspose.pdf as ap
# Criar um novo documento
doc = ap.Document()
page = doc.pages.add()
# Instanciar uma tabela externa que ocupa toda a página
outer_table = ap.Table()
outer_table.column_widths = "100%"
outer_table.horizontal_alignment = ap.HorizontalAlignment.LEFT
# Instanciar um objeto de tabela que será aninhado dentro de outerTable que quebrará dentro da mesma 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
# Adicionar a outerTable aos parágrafos da página
# Adicionar minha tabela à 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)
# Adicionar Linha de Cabeçalho
row = my_table.rows.add()
row.cells.add("cabeçalho 1")
row.cells.add("cabeçalho 2")
row.cells.add("cabeçalho 3")
row.cells.add("cabeçalho 4")
row.cells.add("cabeçalho 5")
row.cells.add("cabeçalho 6")
row.cells.add("cabeçalho 7")
row.cells.add("cabeçalho 11")
row.cells.add("cabeçalho 12")
row.cells.add("cabeçalho 13")
row.cells.add("cabeçalho 14")
row.cells.add("cabeçalho 15")
row.cells.add("cabeçalho 16")
row.cells.add("cabeçalho 17")
for row_counter in range(0, 6):
# Criar linhas na tabela e depois células nas linhas
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)