Skip to content

Fontes embutidas do PDF sobraram no cabeçalho e em dois helpers: a correção da #341 não alcançou tudo #654

Description

@leomurta

A #341 trocou as fontes embutidas do PDF por TTFs para resolver o erro com
letras gregas, registrando as famílias FreeSans/FreeMono/FreeSerif e
convertendo os blocos pdf.font('Courier') do rodapé e do corpo. A conversão
não alcançou todas as chamadas: alguns pdf.text continuam desenhando com a
fonte corrente, que é a Helvetica embutida do próprio PDF.

O que foi medido

Gerando os 13 documentos do spec golden (spec/requests/goldens/reports_golden_spec.rb)
e inspecionando com pdffonts, todos os 13 referenciam Helvetica-Bold sem
embutir a fonte
. Depois de envolver as duas chamadas de PdfHelper#header num
bloco pdf.font("FreeSans"), nove passam a não ter nenhuma fonte não-embutida;
quatro continuam.

Chamadas que ainda usam a fonte corrente:

  • app/helpers/pdf_helper.rb:38 — texto de cabeçalho (pdf_config.text)
  • app/helpers/pdf_helper.rb:60 — título do documento
  • app/helpers/class_schedules_pdf_helper.rb:48 e :56
  • app/helpers/course_classes_pdf_helper.rb:91, :102, :105, :150

Duas outras aparecem como não-embutidas e parecem deliberadas — Courier em
app/views/admissions/admission_processes/short_pdf.pdf.prawn:8 e Times-Roman
no relatório externo. Ficam de fora até alguém confirmar a intenção.

Duas consequências

1. O negrito pedido pelo código não é aplicado. As duas chamadas do
cabeçalho envolvem o texto em <b>...</b>. Como a Helvetica-Bold é
referenciada mas não embutida, o resultado depende da substituição que cada
leitor faz. Num leitor baseado em poppler o texto sai numa face leve — o
negrito não aparece. Com a TTF embutida, sai como o código pede. O mesmo
documento renderizado em máquinas diferentes pode não ficar igual.

2. Texto editável pelo usuário ainda pode derrubar a geração. É a mesma
falha da #341, num caminho que a correção não alcançou. A fonte embutida do PDF
só cobre Windows-1252; um caractere fora dessa tabela levanta
Prawn::Errors::IncompatibleStringEncoding, que vira erro 500 em vez de PDF.
Dois desses textos são configuráveis na interface:

  • pdf_config.text, o cabeçalho editado em Configuração de Documentos
  • CustomVariable.class_schedule_text, em class_schedules_pdf_helper.rb:56

Ou seja, o cenário da #341 — alguém colar um símbolo grego ou matemático — ainda
reproduz por esses dois campos.

Escopo sugerido

Envolver as chamadas listadas em bloco pdf.font("FreeSans") (ou a família que
couber em cada caso) e conferir com pdffonts que nenhum dos 13 documentos sai
com fonte não-embutida, exceto as deliberadas.

O que a mudança custa

Os baselines do golden mudam. O texto extraído é o mesmo, mas as métricas dos
glifos são outras e o título tem character_spacing, então o extrator agrupa os
caracteres de forma diferente:

-HI STÓ RI C O E S C OL A R / P ÓS- GR A D UAÇ ÃO
+HIS T Ó RI CO E S C OL A R / PÓS- GR A D UA Ç Ã O

Onze dos quinze exemplos do reports_golden_spec.rb reprovam e precisam ser
regravados com GOLDEN=overwrite, conferindo um a um antes de aceitar.

Visualmente a diferença é pequena: comparando as duas versões dos 13 documentos,
não há colisão, estouro de faixa nem mudança na contagem de páginas — os títulos
ficam um pouco mais largos e param bem dentro da faixa.

Dúvidas para o mantenedor

  • O Courier do PDF resumido de processo de admissão e o Times-Roman do
    relatório externo são escolha de estilo? Se forem, entram na exceção; se não,
    entram no escopo.
  • Vale exigir que nenhum documento saia com fonte não-embutida, checando isso
    no próprio golden? Seria uma asserção a mais, barata, que impede a regressão
    de voltar por uma chamada nova.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions