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.
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ãonão alcançou todas as chamadas: alguns
pdf.textcontinuam desenhando com afonte 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 referenciamHelvetica-Boldsemembutir a fonte. Depois de envolver as duas chamadas de
PdfHelper#headernumbloco
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 documentoapp/helpers/class_schedules_pdf_helper.rb:48e:56app/helpers/course_classes_pdf_helper.rb:91,:102,:105,:150Duas outras aparecem como não-embutidas e parecem deliberadas —
Courieremapp/views/admissions/admission_processes/short_pdf.pdf.prawn:8eTimes-Romanno 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 aHelvetica-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 DocumentosCustomVariable.class_schedule_text, emclass_schedules_pdf_helper.rb:56Ou 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 quecouber em cada caso) e conferir com
pdffontsque nenhum dos 13 documentos saicom 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 oscaracteres de forma diferente:
Onze dos quinze exemplos do
reports_golden_spec.rbreprovam e precisam serregravados 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
Courierdo PDF resumido de processo de admissão e oTimes-Romandorelatório externo são escolha de estilo? Se forem, entram na exceção; se não,
entram no escopo.
no próprio golden? Seria uma asserção a mais, barata, que impede a regressão
de voltar por uma chamada nova.