ruby-on-rails pdf utf-8 fonts prawn

ruby on rails - Prawn:: Errors:: IncompatibleStringEncoding: su documento incluye texto que no es compatible con el conjunto de caracteres de Windows-1252



ruby-on-rails pdf (3)

De este informe sobre Force Strings a UTF-8 desde cualquier codificación :

"Forzar" una codificación es fácil, sin embargo, no convertirá los caracteres simplemente cambiará la codificación:

str = str.force_encoding("UTF-8") str.encoding.name # => ''UTF-8''

Si quieres realizar una conversión, usa la codificación

De hecho, como @MehmetKaplan dijo:

Se ve que Turquía falta en iso-8859-1.

Por otro lado, iso-8859-9 debería funcionar.

Por lo tanto, ya no necesitarás el force_encoding sino que solo encode

[37] pry(main)> "Eylül Çamcı".encode(''iso-8859-1'') Encoding::UndefinedConversionError: U+0131 from UTF-8 to ISO-8859-1 from (pry):39:in `encode'' [38] pry(main)> "Eylül Çamcı".encode(''iso-8859-9'') => "Eyl/xFCl /xC7amc/xFD"

Esto significa que debe descartar el UTF-8 completamente en su código.

content: "Eylül Çamcı".encode(''iso-8859-9''),

Debajo está mi archivo PDF de Prawn para generar un nombre en el PDF -

def initialize(opportunity_application) pdf = Prawn::Document.new(:page_size => [1536, 2048], :page_layout => :landscape) cell_1 = pdf.make_cell(content: "Eylül Çamcı".force_encoding(''iso-8859-1'').encode(''utf-8''), borders: [], size: 66, :text_color => "000000", padding: [0,0,0,700], font: "app/assets/fonts/opensans.ttf") t = pdf.make_table [[cell_1]] t.draw pdf.render_file "tmp/mos_certificates/application_test.pdf" end

Cuando aparece el nombre Eylül Çamcı, que es turco, aparece el siguiente error:

Prawn::Errors::IncompatibleStringEncoding: Your document includes text that''s not compatible with the Windows-1252 character set. If you need full UTF-8 support, use TTF fonts instead of PDF''s built-in fonts.

Ya estoy usando una fuente TTF que admite los caracteres en ese nombre, ¿qué puedo hacer para imprimir el nombre correctamente?


No estoy seguro de recordar cómo funciona Prawn, pero los archivos PDF no son compatibles con UTF-8, que es la codificación predeterminada de Ruby para objetos String.

De hecho, los archivos PDF solo admiten la codificación ASCII utilizando fuentes internas; cualquier otra codificación requiere que traiga su propia fuente (que también se recomienda para la portabilidad).

La solución consiste en usar mapas de caracteres (CMaps), ya sea CMaps personalizados o predefinidos (fuente BYO).

En general, los archivos PDF incluyen una fuente incrustada (o un subconjunto de una fuente) y un CMap, mapeando el valor de un byte (o, un número de bytes) a un glifo de fuente deseado. es decir, mapeo de 97, que es ''a'' en ASCII, para el glifo å cuando se utiliza la fuente especificada.

La última vez que usé Gambas, creo que admitía fuentes TTF y creaba mapas de fuentes automáticamente usando cadenas UTF-8 para el ingreso de texto, pero tienes que cargar una fuente apropiada en Gamba y ¡recuerda usarla !

Puedes ver un ejemplo en esta respuesta .

¡Buena suerte!

EDITAR

Actualicé la respuesta para reflejar los comentarios de @ mkl.

@mkl señaló que otras codificaciones son compatibles o posibles (fuente BYO), incluida una codificación predefinida de varios bytes (que utiliza CMaps predefinidos).


Se ve que Turquía falta en iso-8859-1 .

Por otro lado, iso-8859-9 debería funcionar.

Por lo tanto, puede tratar de cambiar su código de la misma manera (verifique el número iso que cambié):

... cell_1 = pdf.make_cell(content: "Eylül Çamcı".force_encoding(''iso-8859-9'').encode(''utf-8''), borders: [], size: 66, :text_color => "000000", padding: [0,0,0,700], font: "app/assets/fonts/opensans.ttf") ...

Y un enlace divertido que no solo está relacionado con el conjunto de caracteres, sino también con otras diferencias de internalización para Turquía.

Edición 1: realicé una comprobación básica, parece que el texto ya está en UTF-8. Entonces, ¿por qué necesita cambiar a iso-8859 y volver a UTF-8?

¿Puedes probar "Eylül Çamcı".force_encoding(''utf-8'') solo?

irb(main):013:0> "Eylül Çamcı".encoding => #<Encoding:UTF-8> irb(main):014:0> "Eylül Çamcı".force_encoding(''UTF-8'') => "Eylül Çamcı" irb(main):015:0>

Edición 2: ¿También puedes verificar la ruta de tu fuente? Ambas fuentes existen y la ruta es correcta?

#Rails.root.join(''app/assets/fonts/opensans.ttf'') cell_1 = pdf.make_cell(content: "Eylül Çamcı".force_encoding(''utf-8''), borders: [], size: 66, :text_color => "000000", padding: [0,0,0,700], font: Rails.root.join(''app/assets/fonts/opensans.ttf''))