2016-02-03 23 views
17

TLでの作業; DR: は、いくつかの文字のグリフが欠落している場合は別の特定のフォントを使用して、フォールバックするReportLabのを伝えるのいくつかの方法がありますか?はまた、では、すべてのヨーロッパ言語、ヘブライ語、ロシア語、中国語、日本語、アラビア語のためのグリフが含まれている凝縮TrueTypeフォントを知っていますか?ReportLabの:中国/ Unicode文字

私はReportLabのでレポートを作成してきた、と中国語の文字を含む文字列のレンダリングで問題が発生しました。私が使用してきたフォントは、中国語(ただし、それが含まれないキリル文字、ヘブライ語、アラビア語、ヨーロッパ言語サポートのためのウムラウトのすべての種類のためのグリフが含まれていませんそしてDejaVuなき要約、である - それはかなり汎用性になり、そして私が必要それらはすべて時々あります)

中国語はフォントでサポートされていませんし、すべての言語をサポートするTrueTypeフォントを見つけられず、私たちのグラフィックデザイン要件を満たしています。中国の顧客のレポートは完全に別のフォントを使用するように一時的な回避策として、私は他の言語の文字が文字列内に存在しないことを期待して、唯一の英語と中国語のグリフを含む、それを作りました。しかしこれは、明白な理由のために、不格好であり、それは全体の外観&フィールが設計されているの周りに、そしてDejaVuなきないため、グラフィックデザインを壊します。

質問はですので、1つのドキュメントで複数の言語をサポートし、各言語の指定されたフォントの使用を維持する必要性にどう対処しますか?これは、文字列に複数の言語が混在することがあるため、各文字列にどのONEフォントを使用するかを決めることはオプションではないため、これはさらに複雑になります。

は、いくつかの文字のグリフが不足している場合、特定のフォントを使用し、別のものにフォールバックするReportLabのを伝えるいくつかの方法はありますか?私は間違って理解するかもしれないが、それは可能でなければならないという曖昧なヒントを文書で見つけた。

また、欧州のすべての言語、ヘブライ語、ロシア語、中国語、日本語、アラビア語のグリフを含む圧縮されたTrueTypeフォントについて知っていますか?

ありがとうございました。

+0

私は完全なasnwerを知らないが、私はユニコードフォントを使用すると信じている[リンク] https://en.wikipedia.org/wiki/Unicode_font多くの言語で文字を表示するのに役立つだろう – bmbigbang

答えて

3

この質問は私に一週間を魅了しました。週末なので私はその中にまっすぐ飛び込んできました。MultiFontParagraph普通のParagraphですが、フォントのフォールバック順序を正確に設定できる大きな違いが1つあります。例えば

Example of the font fallback working

私はインターネットで引っ張られ、このランダムな日本語のテキストには、次のフォントフォールバック"Bauhaus", "Arial", "HanaMinA"を使用。最初のフォントに文字用のグリフがあるかどうかをチェックし、使用している場合はそれを使用します。そうでなければ、次のフォントにフォールバックします。現在、コードは各文字の周りにタグを配置するので効率的ではありませんが、これは簡単に修正できますが、わかりやすくするためにここでは行いませんでした。次のようにMultiFontParagraph(git)の源である

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

Google Noto Fontsから

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

まだテストしていないしかし、それは動作するようです。このソリューションは正解ですが、これは私が避けようとしていた解決策でした:)テキストの各文字のすべてのフォントを反復処理する以外の方法はなく、レポートのいくつかは数百ページにも及ぶため、これはパフォーマンスの低下を招く可能性があります。 さらに、 'Paragraph()'だけが問題のある要素ではありません。また、このソリューションをそこに複製することもできますが、(Flowableコンストラクトを使用しない)場合によっては、キャンバス上にテキストを直接描画することもあります。とにかく、ソリューションの応答と功績に感謝します。 – ztorage

+2

ああ、ところで、私は1つのTTFファイルに必要なさまざまなフォントをマージすることになりました。これにより、すべてがシームレスに機能します。 – ztorage

+0

フォントをマージすることは、いつも私が考える最も簡単な解決策です。しかし、この解決法では、最悪のケースでは複雑さはそれほど高くはない.O(N * F * 1)ここで、Nは文字の数であり、Fは指定されたフォントの数であり、適切なフォントが選択されると、必要な文字を供給できるフォントを見つけるために2または3のフォントをチェックするだけで済みます。 – B8vrede

1

:私は上記の例を作成し、次のコードを使用して

Googleがされていますすべての言語をサポートすることを目指す、Notoというフォントファミリの開発調和のとれたルック&フィールです。

unified Noto Sans fontは、次の分野から581個の言語をサポートする、単一のフォントが含まれていますように、ヘブライ語、アラビア語、日本語など

enter image description here

その他は能登のウェブサイト上の個別の項目として記載されています。

関連する問題