2016-02-03 5 views
17

टीएल; डीआर: क्या कोई विशिष्ट फ़ॉन्ट का उपयोग करने के लिए ReportLab को बताने का कोई तरीका है और कुछ वर्णों के लिए ग्लिफ गायब होने पर किसी अन्य पर फ़ॉलबैक है? वैकल्पिक रूप से, क्या आप एक संघीय ट्रू टाइप फ़ॉन्ट के बारे में जानते हैं जिसमें सभी यूरोपीय भाषाओं, हिब्रू, रूसी, चीनी, जापानी और अरबी के लिए ग्लिफ शामिल हैं?रिपोर्टलैब: चीनी/यूनिकोड वर्णों के साथ काम करना

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

चीनी, हालांकि, फ़ॉन्ट के साथ समर्थित नहीं है, और मैं एक ट्रू टाइप फ़ॉन्ट नहीं ढूंढ पा रहा हूं जो सभी भाषाओं का समर्थन करता है, और हमारी ग्राफिक डिज़ाइन आवश्यकताओं को पूरा करता है। एक अस्थायी कामकाज के रूप में, मैंने इसे बनाया ताकि चीनी ग्राहकों के लिए रिपोर्ट पूरी तरह से अलग फ़ॉन्ट का उपयोग करे, जिसमें केवल अंग्रेज़ी और चीनी ग्लिफ शामिल हों, उम्मीद है कि अन्य भाषाओं में वर्ण तारों में मौजूद नहीं होंगे। हालांकि, स्पष्ट कारणों से, चिपचिपा और ग्राफिक डिज़ाइन तोड़ता है, क्योंकि यह डीजावु सांस नहीं है, जिसके आस-पास & महसूस किया गया है।

तो सवाल है, आप एक दस्तावेज़ में एकाधिक भाषाओं का समर्थन करने की आवश्यकता के साथ कैसे निपटेंगे, और प्रत्येक भाषा के लिए निर्दिष्ट फ़ॉन्ट का उपयोग बनाए रखें। इस तथ्य के कारण यह अधिक जटिल बना दिया जाता है कि कभी-कभी तारों में भाषाओं का मिश्रण होता है, इसलिए यह निर्धारित करना कि प्रत्येक स्ट्रिंग के लिए कौन सा फ़ॉन्ट इस्तेमाल किया जाना चाहिए, यह विकल्प नहीं है।

क्या कोई विशिष्ट फ़ॉन्ट का उपयोग करने के लिए ReportLab को बताने का कोई तरीका है, और कुछ वर्णों के लिए ग्लिफ गायब होने पर किसी अन्य पर फ़ॉलबैक है? मुझे दस्तावेज़ों में अस्पष्ट संकेत मिले कि यह संभव होना चाहिए, हालांकि मैं इसे गलत तरीके से समझ सकता हूं।

वैकल्पिक रूप से, क्या आप एक संघीय ट्रू टाइप फ़ॉन्ट के बारे में जानते हैं जिसमें सभी यूरोपीय भाषाओं, हिब्रू, रूसी, चीनी, जापानी और अरबी के लिए ग्लिफ शामिल हैं?

धन्यवाद।

+0

मुझे एक पूर्ण एस्वर नहीं पता है, लेकिन मुझे लगता है कि किसी भी यूनिकोड फोंट का उपयोग करना [लिंक] https://en.wikipedia.org/wiki/Unicode_font आपको कई भाषाओं में वर्ण दिखाने में मदद करनी चाहिए – bmbigbang

उत्तर

3

इस प्रश्न ने मुझे पूरे सप्ताह में मोहित किया, इसलिए सप्ताहांत में मैंने इसे सही तरीके से डाला और वास्तव में एक समाधान मिला जिसे मैंने MultiFontParagraph कहा था, यह एक सामान्य अंतर है Paragraph एक बड़ा अंतर के साथ आप एक फ़ॉन्ट फ़ॉलबैक ऑर्डर सेट कर सकते हैं।

Example of the font fallback working

उदाहरण के लिए इस यादृच्छिक जापानी पाठ मैं इंटरनेट की खींच लिया निम्नलिखित फॉन्ट वापस आने "Bauhaus", "Arial", "HanaMinA" इस्तेमाल किया। यह जांचता है कि क्या पहले फ़ॉन्ट में चरित्र के लिए ग्लिफ है, यदि ऐसा है तो यह इसका उपयोग करता है, अगर यह अगले फ़ॉन्ट पर फ़ॉलबैक नहीं करता है। वर्तमान में कोड वास्तव में कुशल नहीं है क्योंकि यह प्रत्येक चरित्र के चारों ओर टैग रखता है, इसे आसानी से ठीक किया जा सकता है लेकिन स्पष्टता के लिए मैंने इसे यहां नहीं किया है।

निम्नलिखित कोड मैं ऊपर के उदाहरण बनाया का उपयोग करना:

foreign_string = u'6905\u897f\u963f\u79d1\u8857\uff0c\u5927\u53a6\uff03\u5927' 
P = MultiFontParagraph(foreign_string, styles["Normal"], 
        [ ("Bauhaus", "C:\Windows\Fonts\\BAUHS93.TTF"), 
         ("Arial", "C:\Windows\Fonts\\arial.ttf"), 
         ("HanaMinA", 'C:\Windows\Fonts\HanaMinA.ttf')]) 

MultiFontParagraph(git) के स्रोत इस प्रकार है:

from reportlab.pdfbase import pdfmetrics 
from reportlab.pdfbase.ttfonts import TTFont 
from reportlab.platypus import Paragraph 


class MultiFontParagraph(Paragraph): 
    # Created by B8Vrede for http://stackoverflow.com/questions/35172207/ 
    def __init__(self, text, style, fonts_locations): 

     font_list = [] 
     for font_name, font_location in fonts_locations: 
      # Load the font 
      font = TTFont(font_name, font_location) 

      # Get the char width of all known symbols 
      font_widths = font.face.charWidths 

      # Register the font to able it use 
      pdfmetrics.registerFont(font) 

      # Store the font and info in a list for lookup 
      font_list.append((font_name, font_widths)) 

     # Set up the string to hold the new text 
     new_text = u'' 

     # Loop through the string 
     for char in text: 

      # Loop through the fonts 
      for font_name, font_widths in font_list: 

       # Check whether this font know the width of the character 
       # If so it has a Glyph for it so use it 
       if ord(char) in font_widths: 

        # Set the working font for the current character 
        new_text += u'<font name="{}">{}</font>'.format(font_name, char) 
        break 

     Paragraph.__init__(self, new_text, style) 
+1

मैंने अभी तक इसका परीक्षण नहीं किया है , लेकिन ऐसा लगता है कि यह काम करेगा। बात यह है कि यद्यपि यह समाधान सही है, यह वही समाधान था जिसे मैं टालने की कोशिश कर रहा था :) चूंकि टेक्स्ट में प्रत्येक वर्ण के लिए सभी फ़ॉन्ट्स के माध्यम से पुनरावृत्ति करने के अलावा कोई दूसरा तरीका नहीं है, और कुछ रिपोर्टें सैकड़ों पृष्ठों लंबी हैं, इसका परिणाम काफी हद तक प्रभावित हो सकता है। प्लस, 'पैराग्राफ() 'एकमात्र समस्याग्रस्त तत्व नहीं है। मैं कुछ मामलों में सीधे कैनवास पर पाठ खींचता हूं (फ़्लोएबल निर्माण का उपयोग नहीं करता), हालांकि इस समाधान को दोहराया जा सकता है। वैसे भी, समाधान पर प्रतिक्रिया और kudos के लिए धन्यवाद। – ztorage

+2

ओह, वैसे, मैं एक अलग टीटीएफ फ़ाइल में आवश्यक विभिन्न फ़ॉन्ट्स विलय करने के साथ जा रहा था। यह पूरी चीज को निर्बाध रूप से काम करने के लिए बनाता है। – ztorage

+0

फोंट विलय करना हमेशा मुझे लगता है कि सबसे आसान समाधान है। लेकिन इस समाधान के साथ जटिलता सबसे खराब स्थिति में उच्च नहीं है, यह ओ (एन * एफ * 1) है जहां एन वर्णों की संख्या है और एफ निर्दिष्ट फ़ॉन्ट्स की संख्या और शब्दकोश के लिए 1 दिखता है लेकिन यदि उचित फोंट चुने गए हैं, इसे केवल उस फ़ॉन्ट को खोजने के लिए 2 या 3 फोंट की जांच करनी होगी जो आवश्यक चरित्र की आपूर्ति करने में सक्षम है। – B8vrede

1

से Google Noto Fonts:

गूगल कर दिया गया है नोटो नामक एक फ़ॉन्ट परिवार का विकास, जिसका उद्देश्य सभी भाषाओं का समर्थन करना है एक सामंजस्यपूर्ण देखो और महसूस करते हैं।

unified Noto Sans font निम्नलिखित क्षेत्रों से 581 भाषाओं का समर्थन करते हुए एक भी फ़ॉन्ट में शामिल हैं:

enter image description here

ऐसे हिब्रू, अरबी और जापानी के रूप में

दूसरों नोटो वेबसाइट पर अलग आइटम के रूप में सूचीबद्ध हैं।

संबंधित मुद्दे