Skip to content

[PDF Generator] Fórmula gráfica com label e tag <list> descartadas no corpo do PDF #1365

Description

@Rossi-Luciano

Descrição do problema

Dois problemas de perda silenciosa de conteúdo no corpo do PDF gerado, ambos levantados por @pitangainnovare na revisão do PR #1348 (Fase 0 da issue #1347) e deixados fora daquele PR para não bloquear o merge.

1. <disp-formula> gráfica com <label> ainda é descartada (lacuna na Fase 0 da #1347)

O PR #1348 tratou <disp-formula><graphic/></disp-formula> (sem MathML) como figura quando get_text_from_node retorna texto vazio. Mas se a fórmula tiver um <label> (ex.: <disp-formula id="e01"><label>(1)</label><graphic xlink:href="..."/></disp-formula>), get_text_from_node retorna o texto do label ("(1)"), que não é vazio - a condição not para_text nunca aciona o tratamento como figura, o <graphic> é descartado e só o texto "(1)" sobra como parágrafo solto. É o mesmo Modo 1 (perda total de conteúdo) que a Fase 0 da #1347 define, só que num formato de <disp-formula> não coberto por aquele PR.

Local: extract_body_data, em packtools/sps/formats/pdf/pipeline/xml.py (bloco elif child.tag == 'disp-formula':).

Ajuste sugerido na revisão (identificar a fórmula gráfica pela presença de <graphic> sem MathML, em vez de por "texto vazio"):

elif child.tag == 'disp-formula':
    has_graphic = child.find('.//graphic') is not None
    has_math = bool(child.xpath('.//*[local-name()="math"]'))

    if has_graphic and not has_math:
        formula_fig = extract_figure_data(child)
        formula_key = child.get('id') or formula_fig.get('href') or ''
        if not formula_key or formula_key not in seen_fig_keys:
            sec['figures'].append(formula_fig)
            if formula_key:
                seen_fig_keys.add(formula_key)
        continue

    para_text = xml_utils.get_text_from_node(child).strip()
    if para_text:
        sec['paragraphs'].append(para_text)

2. Tag <list> não é tratada no corpo do artigo

O mesmo laço de extract_body_data só reconhece p e disp-formula como filhos diretos de <sec>; qualquer outra tag (incluindo <list>) cai no else: continue e é descartada por completo, com todos os <list-item> que contém. Isso não é específico de fórmula: qualquer <list> (bullet, order ou simple) no corpo é perdida, mesmo sem fórmula nenhuma dentro.

Foi identificado ao inspecionar a5.xml do corpus de teste: mesmo após o PR #1348 corrigir a perda de <disp-formula> irmã de <p>, as Equações 3 a 10 (seção "3.4. Nonlinear regression modeling") continuavam ausentes do PDF, porque estão dentro de <list id="L5" list-type="simple"><list-item><p>...<disp-formula>..., não diretamente em <sec>. O mesmo arquivo também tem duas listas de texto comum (L1, L2, seções 2.2.1/2.2.2) igualmente descartadas.

Passos para reproduzir o problema

  1. Gerar o PDF de a5.xml do corpus de teste (layout_examples_rafael/corpus/).
  2. Seção "2.2.1" (Treatment Series A): o parágrafo "The treatments included:" aparece, mas a lista <list id="L1"> com a descrição de T1-T4 desaparece.
  3. Seção "3.4. Nonlinear regression modeling": o texto cita "Equations 3-10", mas nenhuma das 8 fórmulas (dentro de <list id="L5">) aparece.
  4. Para o caso do <label>: montar um <disp-formula id="e01"><label>(1)</label><graphic xlink:href="..."/></disp-formula> como irmão de <p> dentro de <sec> e rodar extract_body_data - o resultado tem "(1)" em paragraphs e nada em figures.

Comportamento esperado

  • Uma <disp-formula> com <graphic> deve virar figura independentemente de ter <label> ou não.
  • Uma <list> no corpo deve ser renderizada no DOCX/PDF (ex.: parágrafos com marcador/numeração, um por <list-item>), preservando o conteúdo - inclusive quando um <list-item> contém uma <disp-formula>.

Anexos

Amostras do corpus de teste com <list> no corpo (5 de 26): a5.xml (5 ocorrências, inclui o caso de fórmulas dentro de lista), a12.xml (2), a25.xml (1), a27.xml (1), a28.xml (1).

Funções envolvidas: extract_body_data (packtools/sps/formats/pdf/pipeline/xml.py), e o(s) renderer(s) DOCX correspondente(s) em packtools/sps/formats/pdf/renderer/.

Ambiente utilizado

packtools, gerador de PDF (packtools/sps/formats/pdf/), observado ao gerar PDFs do corpus de teste de amostras reais.

Contexto e relação com a #1347

Ambos os pontos foram levantados por @pitangainnovare na revisão do PR #1348, que implementou a Fase 0 da #1347 (parar a perda total de conteúdo de <disp-formula> - Modo 1). O ponto 1 é literalmente um caso de Modo 1 não coberto por aquele PR - continua fazendo parte do escopo da Fase 0, só que não bloqueou o merge por ser um caso de borda específico (label + graphic). O ponto 2 (<list>) é um problema estrutural independente do plano de fórmulas da #1347, mas as duas questões convergem quando uma fórmula está dentro de um <list-item> (caso de a5.xml) - por isso qualquer correção de <list> precisa soltar a mesma lógica de detecção de <disp-formula> gráfica/MathML usada em extract_body_data para o conteúdo de cada <list-item>.

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 PDF

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions