ruby on rails - Prawn:: त्रुटियां:: असंगत StringEncoding: आपके दस्तावेज़ में पाठ शामिल है जो Windows-1252 वर्ण सेट के साथ संगत नहीं है




ruby-on-rails pdf (2)

पीडीएफ पर एक नाम उत्पन्न करने के लिए नीचे मेरी प्रोन पीडीएफ फाइल है -

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

तुर्की नामक Eylül Çamcı नाम देने पर, मुझे निम्न त्रुटि मिलती है -

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.

मैं पहले से ही एक टीटीएफ फ़ॉन्ट का उपयोग कर रहा हूं जो उस नाम के पात्रों का समर्थन करता है, मैं नाम सही तरीके से प्रिंट करने के लिए क्या कर सकता हूं?


मुझे यकीन नहीं है कि मुझे याद है कि प्रोन कैसे काम करता है, लेकिन पीडीएफ फाइलें यूटीएफ -8 का समर्थन नहीं करती हैं, जो स्ट्रिंग ऑब्जेक्ट्स के लिए डिफ़ॉल्ट रूबी एन्कोडिंग है।

वास्तव में, पीडीएफ फाइलें केवल आंतरिक फ़ॉन्ट्स का उपयोग करके एएससीआईआई एन्कोडिंग का समर्थन करती हैं - किसी भी अन्य एन्कोडिंग की आवश्यकता होती है कि आप अपना स्वयं का फ़ॉन्ट लाएं (जिसे पोर्टेबिलिटी के लिए भी अनुशंसित किया जाता है)।

वर्कअराउंड या तो चरित्र मानचित्र (सीएमएपीएस) का उपयोग करना है - या तो कस्टम सीएमएपी या प्री-डिफ़ाइंड वाले (बीईओ फ़ॉन्ट)।

आम तौर पर, पीडीएफ फाइलों में एक एम्बेडेड फ़ॉन्ट (या फ़ॉन्ट का सबसेट) शामिल होता है, और एक सीएमएपी, एक बाइट (या, बाइट्स की संख्या) के वैल्यू को वांछित फ़ॉन्ट ग्लाइफ में मैपिंग करता है। यानी 97 का मानचित्रण, जो निर्दिष्ट फ़ॉन्ट का उपयोग करते समय एसीसीआईआई में 'ए' है, एक ग्लाइफ के लिए।

पिछली बार मैंने प्रॉन का इस्तेमाल किया था, मुझे लगता है कि यह टीटीएफ फोंट का समर्थन करता है और टेक्स्ट इनपुट के लिए यूटीएफ -8 स्ट्रिंग्स का उपयोग करके स्वचालित रूप से फ़ॉन्ट मैप्स बनाएगा - लेकिन आपको प्रोन में उचित फ़ॉन्ट लोड करना होगा और इसका उपयोग करना याद रखना होगा !

आप इस उत्तर में एक उदाहरण देख सकते हैं।

शुभ लाभ!

संपादित करें

मैंने @ एमकेएल की टिप्पणियों को प्रतिबिंबित करने के लिए उत्तर अपडेट किया।

@ एमकेएल ने इंगित किया कि अन्य एन्कोडिंग समर्थित हैं या संभव (बीईओ फ़ॉन्ट), पूर्वनिर्धारित कुछ मल्टीबाइट एन्कोडिंग (जो प्री-डिफ़ाइंड सीएमएप्स का उपयोग करते हैं) समेत।


यह iso-8859-1 में तुर्की गायब है।

दूसरी तरफ iso-8859-9 काम करना चाहिए।

तो आप अपना कोड बदलने की कोशिश कर सकते हैं (आईएसओ नंबर जो मैंने बदला है) की जांच करें:

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

और एक मजेदार लिंक जो न केवल चरित्र सेट से संबंधित है बल्कि तुर्की के लिए अन्य आंतरिककरण अंतर भी है।

संपादित करें 1: मैंने मूल जांच की है, ऐसा लगता है कि पाठ पहले ही यूटीएफ -8 में है। तो आईएसओ -885 9 में बदलने की जरूरत क्यों है और यूटीएफ -8 पर वापस आना चाहिए?

क्या आप कृपया "Eylül Çamcı".force_encoding('utf-8') अकेले आज़मा सकते हैं?

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>

संपादित करें 2: क्या आप अपना फ़ॉन्ट पथ भी देख सकते हैं? दोनों फ़ॉन्ट मौजूद हैं और पथ उचित है?

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




prawn