# app/services/pdf/fonte_utf8.rb # # Registro da família DejaVu Sans (TrueType) num Prawn::Document. # # Por que existe: as fontes embutidas do Prawn (AFM/Helvetica) só aceitam o charset # Windows-1252 e estouram Prawn::Errors::IncompatibleStringEncoding em qualquer # caractere fora dele ("✓" no extrato do motorista; e, no romaneio, endereços que # chegam do cliente com "SÃO PAULO", "INDAIÁ", "JARDIM MIRIAM"). # # Estava privado em Pdf::BasePdf, mas o motivo não tem nada a ver com o layout # retrato/preto-laranja da Reem — vale para todo PDF do app. Pdf::RomaneioPdf é # paisagem com a marca da GADE e não herda de BasePdf, então precisa do mesmo # registro sem arrastar o cabeçalho junto. module Pdf module FonteUtf8 # Resolvido em tempo de CHAMADA, não de carga: Pdf::RomaneioPdf precisa ser # `require`-ável num container Ruby pelado (sem Rails) para a conferência de # layout em PNG — é o único jeito de validar PDF neste repositório, que não tem # Ruby local. Uma constante com Rails.root no corpo do módulo mataria isso. def self.dir_padrao if defined?(Rails) && Rails.respond_to?(:root) && Rails.root Rails.root.join('app', 'assets', 'fonts').to_s else File.expand_path('../../assets/fonts', __dir__) end end # Como os PDFs só usam normal e :bold, mapeamos italic/bold_italic para as # variantes existentes — assim um :italic pedido por engano não levanta erro. def registrar_fonte_utf8(documento, dir = Pdf::FonteUtf8.dir_padrao) documento.font_families.update( 'DejaVu' => { normal: File.join(dir.to_s, 'DejaVuSans.ttf'), bold: File.join(dir.to_s, 'DejaVuSans-Bold.ttf'), italic: File.join(dir.to_s, 'DejaVuSans.ttf'), bold_italic: File.join(dir.to_s, 'DejaVuSans-Bold.ttf') } ) documento.font 'DejaVu' end end end