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
- Gerar o PDF de
a5.xml do corpus de teste (layout_examples_rafael/corpus/).
- 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.
- 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.
- 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>.
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 quandoget_text_from_noderetorna 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_noderetorna o texto do label ("(1)"), que não é vazio - a condiçãonot para_textnunca 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, empacktools/sps/formats/pdf/pipeline/xml.py(blocoelif 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"):2. Tag
<list>não é tratada no corpo do artigoO mesmo laço de
extract_body_datasó reconhecepedisp-formulacomo filhos diretos de<sec>; qualquer outra tag (incluindo<list>) cai noelse: continuee é 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.xmldo 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
a5.xmldo corpus de teste (layout_examples_rafael/corpus/).<list id="L1">com a descrição de T1-T4 desaparece.<list id="L5">) aparece.<label>: montar um<disp-formula id="e01"><label>(1)</label><graphic xlink:href="..."/></disp-formula>como irmão de<p>dentro de<sec>e rodarextract_body_data- o resultado tem"(1)"emparagraphse nada emfigures.Comportamento esperado
<disp-formula>com<graphic>deve virar figura independentemente de ter<label>ou não.<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) empacktools/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 dea5.xml) - por isso qualquer correção de<list>precisa soltar a mesma lógica de detecção de<disp-formula>gráfica/MathML usada emextract_body_datapara o conteúdo de cada<list-item>.