2017-09-07 2 views
22

unten meine Garnelen PDF-Datei einen Namen auf dem PDF zu generieren -Garnele :: Fehler :: IncompatibleStringEncoding: Ihr Dokument enthält Text, der mit den Windows-1252 Zeichen nicht kompatibel ist gesetzt

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 

Beim Rendern den Namen Eylül Çamcı die Türkisch, bekomme ich folgende Fehler -

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. 

ich bin schon eine TTF-Schriftart, die die Zeichen in diesem Namen unterstützt, was kann ich tun, richtig den Namen drucken?

+0

Folgen Sie dieser Anleitung https://stackoverflow.com/questions/37286976/ruby-how-to-use-different-fonts-in-prawn#37287069 –

+0

Ich versuchte dies auch, und es spuckte den gleichen Fehler . Hier ist der Kern dessen, was ich versucht habe - https://gist.github.com/mikevic/e1617641704aed9d8642b54fb5ea0351 –

+0

fehlt nicht die 'font" OpenSans "'. Ich habe deinen Kern überprüft, im folgenden Post haben sie zuerst die Schriftfamilie aktualisiert und eine neue für "Arial" erstellt => { : normal => "/assets/fonts/Arial.ttf", : italic => "/assets/fonts/Arial Italic.ttf ", }' dann sagen sie 'Prawnpdf', diese Schriftfamilie mit 'font" Arial "' –

Antwort

9

Es scheint, dass Türkisch in iso-8859-1 fehlt.

Auf der anderen Seite sollte iso-8859-9 funktionieren.

So können Sie versuchen, Ihren Code zu ändern, wie (überprüfen Sie die ISO-Zahl, die ich geändert):

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

Und ein fun link, die nicht nur mit Zeichensatz, sondern auch andere Internalisierung Unterschiede für die Türkei in Zusammenhang steht.


Edit 1: habe ich eine grundlegende Überprüfung, es scheint der Text bereits in UTF-8 ist. Warum also auf iso-8859 wechseln und zu UTF-8 zurückkehren?

Können Sie bitte versuchen "Eylül Çamcı".force_encoding('utf-8') allein?

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: Auch können Sie Ihre Fontpath überprüfen? Beide Schriftarten existieren und der Pfad ist korrekt?

#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

zu verwenden Entschuldigung, aber ich bekomme immer noch den gleichen Fehler, wenn ich versuche, das zu ändern ISO-Code auch:/ –

+0

Sorry .. Scheint, ich irre dich. Bitte überprüfe meine bearbeitete Antwort. Ich kann nicht lösen, aber kann uns einen Hinweis geben. –

+0

Ich bekomme immer noch den gleichen Fehler, Sorry:/ –

2

Von diesem anwser über Force strings to UTF-8 from any encoding:

"Erzwingen" eine Codierung einfach ist, aber es wird nicht die Zeichen konvertieren nur die Codierung ändern:

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

Wenn Sie möchte eine Umwandlung durchführen, verwenden codieren

der Tat, wie @MehmetKaplan sagte:

Es Nähte Türkisch in iso-8859-1 fehlt.

Auf der anderen Seite sollte ISO-8859-9 funktionieren.

Daher werden Sie die force_encoding nicht mehr brauchen, aber nur 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" 

Das bedeutet Sie die UTF-8 ganz in Ihrem Code fallen haben.

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

Ich bekomme immer noch den gleichen Fehler:/Denken Sie, dass es etwas mit den Schriften zu tun hat? Ich habe auf Google Fonts überprüft und Opensans unterstützt die Zeichenfolge, die ich versuche. –

2

Ich bin mir nicht sicher, ob ich erinnere mich, wie Garnelen funktionieren, aber PDF-Dateien nicht unterstützen UTF-8, die die Standard-Ruby-Codierung für String-Objekte ist.

In der Tat unterstützen PDF-Dateien nur ASCII-Codierung mit internen Schriftarten - für jede andere Codierung müssen Sie Ihre eigene Schriftart (die auch für die Portabilität empfohlen wird).

Die Problemumgehung besteht darin, Zeichenkarten (CMaps) zu verwenden - entweder benutzerdefinierte CMaps oder vordefinierte (BYO-Schriftart).

Im Allgemeinen enthalten PDF-Dateien eine eingebettete Schriftart (oder eine Teilmenge einer Schriftart) und eine CMap, die den Wert eines Bytes (oder einer Anzahl von Bytes) einer gewünschten Schriftart zuordnen. d.h. Zuordnung 97, die in ASCII "a" ist, zu der å-Glyphe, wenn die spezifizierte Schriftart verwendet wird.

ich das letzte Mal Garnelen verwendet wird, halte ich es für TTF-Fonts unterstützt und erstellt Schrift Karten automatisch UTF-8-Strings für die Texteingabe - aber Sie eine geeignete Schriftart in Garnelen laden sind, und vergessen es zu bedienen!.

Sie können ein Beispiel in this answer sehen.

Viel Glück!

EDIT

ich die Antwort aktualisiert @ mkl Kommentare zu reflektieren.

@mkl wies darauf hin, dass andere Kodierungen unterstützt oder möglich sind (BYO Schriftart), einschließlich vordefinierten einige Multibyte-Kodierung (die vordefinierte CMaps verwenden).

+0

* "PDF-Dateien unterstützen nur ASCII-Codierung." * - das ist einfach falsch. Es gibt eine breite Palette von möglichen Kodierungen für Schriftarten in PDFs, sowohl Einzelbyte als auch Multibyte. Lediglich UTF-8 gehört nicht zu ihnen. – mkl

+0

@mkl - Ich glaube, du täuschst dich. Multi-Byte-Codierungen sind im PDF-Format nicht möglich, und eine andere Codierung als ASCII (mit einer begrenzten Anzahl von eingebauten Schriftarten) erfordert, dass Sie Ihre eigene Schriftart mitbringen und die Glyphen zuordnen. Sie denken vielleicht eher an das Authoring-Tool als an das Dateiformat. – Myst

+0

* "erfordert, dass Sie Ihre eigene Schriftart mitbringen" * - aber was ist das Problem dabei? Einbetten von Schriften ist eigentlich eine Notwendigkeit *, wenn PDFs wirklich * portabel * sein sollen.Das heißt, auch wenn nur die Standard 14 Schriftarten betrachtet werden, es gibt viel mehr als nur ASCII, bitte sehen Sie sich Anhang D der PDF Spezifikation ISO 32000-1 an (Teil 2 wurde in diesem Jahr veröffentlicht, konnte aber nicht verglichen werden noch). Zusätzlich zu diesen Standard-14-Fonts unterstützt PDF viele vordefinierte Multi-Byte-Kodierungen (siehe z. B. Abschnitt 9.7.5 in ISO 32000-1) und eine Option zum Erstellen eigener Kodierungen. – mkl

Verwandte Themen