Tabelas — cabeçalho, valor e rodapé (totais)
Além das colunas normais, uma tabela pode ter uma linha de totais
(footer) — uma célula por coluna, cada uma um template de verdade
(texto fixo e/ou {token}/{SUM(...)}). Desenha só uma vez, na última
fatia, mesmo se a tabela paginar (nunca repete feito o cabeçalho).
Estilo, em três níveis
Cor de fundo/texto e tamanho de fonte são configuráveis do mais genérico ao mais específico:
- Cabeçalho inteiro —
headBackgroundColor/headTextColor/headFontSize - Linha de valor inteira (todas as linhas de dado) —
bodyBackgroundColor/bodyTextColor/bodyFontSize - Rodapé inteiro —
footerBackgroundColor/footerTextColor/footerFontSize
...e por coluna individual via columnStyles (cabeçalho e valor
separados, sobrescreve só aquela coluna). Sem nada definido, cai no
azul/branco/9pt de sempre — templates antigos não mudam de aparência.
A lista "Colunas atuais da tabela" no painel deixa arrastar pra
reordenar (desloca head/content/footer/columnStyles juntos,
pelo índice) e tem um botão "+" pra adicionar coluna de uma fonte de
dados conhecida.
Largura de coluna
columnWidths (mm, uma entrada por coluna, esparso — mesma convenção
de columnStyles) define uma largura explícita pra uma coluna, seja
pelo input numérico no painel de estilo daquela coluna, seja arrastando
o divisor entre dois cabeçalhos de coluna direto no canvas. Coluna sem
largura própria divide, em partes iguais, o que sobra da largura total
da tabela — com columnWidths totalmente ausente, toda coluna ainda
divide a largura igualmente, exatamente como antes disso existir.
Alinhamento de texto
Cada bloco tem seu próprio alinhamento horizontal/vertical: headAlign/
bodyAlign/footerAlign ("left" default, "center", "right") e
headVerticalAlign/bodyVerticalAlign/footerVerticalAlign ("top",
"middle" default, "bottom").
Arredondamento de canto
headBorderRadius/bodyBorderRadius/footerBorderRadius recebem cada
um um TableCornerRadii ({ topLeft?, topRight?, bottomLeft?, bottomRight? }, mm) — ausente/0 continua reto, como sempre. Só os
cantos que tocam a borda externa da tabela fazem sentido por bloco, e o
painel só mostra esses: cabeçalho arredonda topLeft/topRight (o
corpo sempre desenha logo abaixo dele), rodapé arredonda bottomLeft/
bottomRight, e o corpo também arredonda bottomLeft/bottomRight,
mas só enquanto não há rodapé — com a linha de totais ligada, é o
rodapé que fecha os cantos de baixo.
Linha zebrada
bodyBandColor define o fundo das linhas de dado de índice ÍMPAR
(0-based), deixando as linhas pares com bodyBackgroundColor de sempre
(branco/transparente por padrão) — uma tabela zebrada clássica. Ausente
= sem zebra, toda linha usa bodyBackgroundColor.
Paletas prontas de estilo
O seletor Paleta na aba Estilo aplica um esquema de cor inteiro num
clique só — agrupado Claro/Médio/Escuro, cada um com uma opção azul/
verde/laranja/cinza (e roxo, só claro/médio), mais um default — mesma
ideia do "Formatar como Tabela" do Excel. Escolher um preenche
headBackgroundColor/headTextColor/bodyBandColor (continua editável
à mão depois); colorPalette só guarda qual preset mostrar selecionado
da próxima vez que o seletor abrir — não é lido pelo generatePdf, só
os campos de cor de verdade são.
Paginação
Se uma tabela (ou seção repetida) do corpo tiver mais linhas/itens do
que cabem numa página, o generatePdf quebra em várias páginas
automaticamente. Todo item do corpo — tabela, seção, texto, imagem
— é processado numa sequência só, ordenada por Y: quando um
termina, o próximo continua logo abaixo (mesma página ou nova, o que
couber), preservando o espaçamento desenhado no editor mesmo que algo
antes tenha crescido ou mudado de página.
No editor de cada tabela dá pra desligar "Repetir cabeçalho da tabela nas próximas páginas" (default ligado).
Cabeçalho, rodapé e margens
Template.headerHeight/footerHeight/marginLeft/marginRight (mm)
são faixas que se repetem em toda página do PDF gerado. Não existe
campo de "zona" no schema — um campo cai automaticamente no cabeçalho/
rodapé/margem quando sua posição (x/y) fica contida ali.
Dentro de um campo de texto que caia nessas faixas, os tokens especiais
{pageNumber} e {pageCount} funcionam direto no conteúdo e são
resolvidos de novo em cada página — útil pra "Página 1 de 3" no
rodapé.