Skip to content

[PDF Generator] Grade de tabela desalinhada quando thead/tbody são inconsistentes (pós-fix do #1371) #1380

Description

@Rossi-Luciano

Descrição do problema

O PR #1373 (issue #1371) corrige o IndexError que travava a geração inteira do PDF quando uma tabela tem <thead>/<tbody> com números de colunas diferentes. Mas a correção usa max(colunas do header, colunas do body) apenas como largura defensiva da tabela DOCX — ela evita o crash, não garante que o conteúdo fique posicionado na coluna correta. Revisando os PDFs reais gerados a partir do corpus de 593 artigos, o conteúdo de várias tabelas sai desalinhado mesmo sem crash.

Achados (revisão de @pitangainnovare no PR #1373, mais 1 achado complementar encontrado durante revisão automatizada do mesmo PR):

  1. BJT – Tabela 5: <thead> mistura <td/> e <th>. Como a extração considera somente <th>, a célula vazia inicial é descartada e os cabeçalhos "Idade" e "Experiência" ficam deslocados uma coluna para a esquerda.
  2. RBCS – Tabela 1: o cálculo da largura não considera as posições já ocupadas por rowspan de linhas anteriores. Cabeçalhos como "MDL" e "Increase in cumulative NH3-N loss" não ficam posicionados corretamente.
  3. DELTA – Tabela 6: o XML tem uma inconsistência real entre os colspan declarados e a quantidade de colunas do corpo. O PDF é gerado, mas os grupos do cabeçalho continuam desalinhados.
  4. RBPV (2 artigos): a geração deixa de falhar, mas colunas vazias adicionais podem comprimir as tabelas.
  5. Célula de cabeçalho sem estilo (achado complementar): quando o corpo é mais largo que o cabeçalho, _populate_headers só estiliza células até len(header_row), não até num_cols — a(s) coluna(s) extra(s) do cabeçalho ficam sem texto e sem nenhuma formatação (sem negrito, sem tamanho 7pt, sem margens ajustadas), destoando visualmente das demais células do cabeçalho.

Passos para reproduzir o problema

  1. bjt/v29/2764-1589-bjt-29-e1526.xml (anexo a36.xml no corpus layout_examples_rafael/corpus/): gerar o PDF e observar a Tabela 5 com cabeçalho deslocado uma coluna para a esquerda.
  2. rbcs/v50/... (corpus layout_roberta, ainda não copiado para layout_examples_rafael): gerar o PDF e observar a Tabela 1 com cabeçalhos mal posicionados por causa de rowspan não contabilizado.
  3. delta/v42n2/...: gerar o PDF e observar a Tabela 6 com grupos de cabeçalho desalinhados.
  4. rbpv/v35n1/... e rbpv/v35n3/...: gerar o PDF e observar colunas vazias extras comprimindo as tabelas.
  5. Reproduzir o achado 5 isoladamente chamando add_table() com headers=[['', 'H1']] e rows=[['row-label', 'A', 'B']] (header com 2 colunas, body com 3, sem colspan) — a 3ª célula do cabeçalho sai sem nenhum run no .docx gerado.

Comportamento esperado

Os cabeçalhos e colunas devem ficar alinhados fielmente com a estrutura declarada no XML, mesmo quando <thead>/<tbody> têm contagens de colunas diferentes ou misturam <td>/<th>. Nenhuma célula de cabeçalho deveria ficar sem formatação aplicada.

Direção de correção sugerida (@pitangainnovare, no review do PR #1373): reescrever a extração da grade da tabela como um único algoritmo que:

  1. considere <th> e <td> na ordem em que aparecem;
  2. preserve células vazias;
  3. reserve as posições ocupadas por rowspan;
  4. aplique colspan;
  5. produza dados e spans na mesma passagem.

Para XMLs realmente inconsistentes (caso DELTA), o comportamento deveria ser conservador: respeitar os spans declarados, completar posições ausentes com células vazias e, se possível, emitir um aviso — sem inferir automaticamente uma nova estrutura semântica.

O max(...) introduzido no PR #1373 deveria permanecer apenas como proteção defensiva contra crash, não como a solução de posicionamento.

Screenshots ou vídeos

Não anexado nesta issue — os PDFs analisados (BJT, RBCS, DELTA, RBPV) estão descritos no review do PR #1373.

Anexos

Ambiente utilizado

packtools, gerador de PDF (packtools/sps/formats/pdf/), encontrado durante o review do PR #1373 (issue #1371) e complementado durante revisão automatizada do mesmo PR, contra o corpus real de 593 artigos fornecido pela Roberta.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

PDF generatorFuncionalidade de geração de PDFbug

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions