2017-09-07 9 views
22

est en dessous de mon fichier PDF Prawn pour générer un nom sur le PDF -Prawn :: Erreurs :: IncompatibleStringEncoding: Votre document contient du texte qui est incompatible avec le caractère Windows 1252 mis

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 

Lors du rendu le nom eylül Çamci qui est turc, je reçois l'erreur suivante -

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. 

J'utilise déjà un que puis-je police TTF qui prend en charge les caractères de ce nom, faire pour imprimer le nom correctement?

+0

suivez-vous ce instructions https://stackoverflow.com/questions/37286976/ruby-how-to-use-different-fonts-in-prawn#37287069 –

+0

J'ai essayé cela aussi, et il a jailli la même erreur . Voici l'essentiel de ce que j'ai essayé - https://gist.github.com/mikevic/e1617641704aed9d8642b54fb5ea0351 –

+0

ne vous manque pas 'font" Opensans "'. J'ai vérifié votre sens, dans le post suivant, ils ont d'abord mis à jour la famille de polices et en créer une nouvelle pour '' "Arial" => { : normal => "/assets/fonts/Arial.ttf", : italic => "/assets/fonts/Arial Italic.ttf ", }' alors ils disent à 'Prawnpdf' d'utiliser cette famille de polices avec' font "Arial" ' –

Répondre

9

Il coutures turque est manquant dans iso-8859-1. Par contre, iso-8859-9 devrait fonctionner.

Ainsi, vous pouvez essayer de changer votre code comme (vérifiez le numéro iso que j'ai changé):

... 
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") 
... 

Et fun link qui est non seulement liée à jeu de caractères, mais aussi d'autres différences de intériorisation pour la Turquie.


Edit 1: J'ai fait un chèque de base, il semble que le texte est déjà en UTF-8. Alors pourquoi changer d'iso-8859 et revenir à UTF-8?

Pouvez-vous s'il vous plaît essayer "Eylül Çamcı".force_encoding('utf-8') seul?

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> 

Edit 2: vous pouvez également vérifier votre chemin de police? Les deux polices existent et le chemin est-il correct?

#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')) 
+0

Désolé, mais je reçois toujours la même erreur quand j'essaie de changer le Code ISO ainsi:/ –

+0

Désolé .. Il semble que je vous ai induit en erreur. S'il vous plaît vérifier ma réponse éditée. Je ne peux pas résoudre mais peut nous donner un indice. –

+0

Je reçois toujours la même erreur, Désolé:/ –

2

De cette anwser à propos Force strings to UTF-8 from any encoding:

"forcer" un codage est facile, mais il ne convertit pas les caractères changer simplement l'encodage:

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

Si vous vouloir effectuer une conversion, utiliser encoder

En effet, comme @MehmetKaplan dit:

Il coutures turc manque dans iso-8859-1.

D'autre part, iso-8859-9 devrait fonctionner.

Par conséquent, vous ne aurez pas besoin force_encoding plus mais juste 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" 

Cela signifie que vous devez laisser tomber le UTF-8 entièrement dans votre code.

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

Je reçois toujours la même erreur:/Pensez-vous que cela a quelque chose à voir avec les polices? J'ai vérifié sur Google Fonts et Opensans soutient la chaîne que j'essaye avec. –

2

Je ne suis pas sûr que je me souviens comment fonctionne Prawn, mais les fichiers PDF ne prennent pas en charge UTF-8, qui est la valeur par défaut pour les objets Ruby encodage String. En fait, les fichiers PDF ne supportent que l'encodage ASCII en utilisant des polices internes - tout autre encodage nécessite que vous apportiez votre propre police (ce qui est également recommandé pour la portabilité). La solution de contournement consiste à utiliser des mappages de caractères (CMaps) - des CMAP personnalisés ou prédéfinis (police BYO).

Généralement, les fichiers PDF incluent une police incorporée (ou un sous-ensemble d'une police) et un CMap, mappant la valeur d'un octet (ou, un nombre d'octets) à un glyphe de police souhaité. c'est-à-dire le mappage 97, qui est "a" en ASCII, au glyphe å lors de l'utilisation de la police spécifiée.

La dernière fois que je Prawn, je pense qu'il a soutenu les polices TTF et créé des cartes de police automatiquement en utilisant UTF-8 cordes pour la saisie de texte - mais vous devez charger une police appropriée dans Prawn et souvenez-vous de l'utiliser!.

Vous pouvez voir un exemple dans this answer.

Bonne chance!

EDIT

Je mis à jour la réponse à tenir compte des commentaires @ MKL. @mkl a souligné que d'autres codages sont supportés ou possibles (police BYO), y compris un codage multi-octets prédéfini (qui utilise des CMaps prédéfinis).

+0

* "En fait, les fichiers PDF ne supportent que l'encodage ASCII." * - c'est tout simplement faux. Il existe une large palette de codages possibles pour les polices dans les fichiers PDF, à la fois sur un octet et sur plusieurs octets. Simplement UTF-8 arrive à ne pas être parmi eux. – mkl

+0

@mkl - Je pense que vous vous trompez. Les encodages multi-octets ne sont pas possibles dans le format PDF et tout encodage autre que ASCII (avec un nombre limité de polices intégrées) nécessite que vous apportiez votre propre police et que vous fassiez correspondre les glyphes. Vous pensez peut-être à l'outil de création plutôt qu'au format de fichier. – Myst

+0

* "nécessite que vous apportiez votre propre police" * - mais quel est le problème? L'incorporation de polices est en fait une * nécessité * si vous voulez que les PDF soient vraiment * portables *.Cela dit, même si l'on ne considère que les polices standard 14, il y a bien plus que l'ASCII, veuillez consulter l'Annexe D de la spécification PDF ISO 32000-1 (la partie 2 a été publiée cette année mais je ne pouvais pas comparer encore). Et au-delà de ces polices standard 14, PDF prend en charge de nombreux codages multi-octets prédéfinis (voir par exemple la section 9.7.5 de l'ISO 32000-1) et une option permettant de créer vos propres encodages. – mkl