python unicode fonts reportlab chinese-locale

python - ReportLab: trabajando con caracteres chinos/Unicode



fonts chinese-locale (2)

TL; DR: ¿Hay alguna forma de decirle a ReportLab que use una fuente específica, y que la sustituya a otra si faltan glifos para algunos caracteres? Alternativamente, ¿sabe de una fuente TrueType condensada que contenga los glifos de todos los idiomas europeos, hebreo, ruso, chino, japonés y árabe?

He estado creando informes con ReportLab y he encontrado problemas con las cadenas de renderizado que contienen caracteres chinos. La fuente que he estado usando es DejaVu Sans Condensed, que no contiene los glifos para el chino (sin embargo, sí contiene cirílico, hebreo, árabe y todo tipo de Umlauts para el soporte del idioma europeo, lo que lo hace bastante versátil, y necesito todos de vez en cuando)

Sin embargo, el chino no es compatible con la fuente y no he podido encontrar una fuente TrueType que sea compatible con TODOS los idiomas y que cumpla con nuestros requisitos de diseño gráfico. Como solución temporal, lo hice para que los informes para clientes chinos usen una fuente completamente diferente, que contenga solo glifos en inglés y chino, con la esperanza de que no haya caracteres en otros idiomas en las cadenas. Sin embargo, esto es, por razones obvias, torpe y rompe el diseño gráfico, ya que no es DejaVu Sans, en torno al cual se ha diseñado todo el aspecto y la sensación.

Entonces, la pregunta es , ¿cómo lidiaría con la necesidad de admitir varios idiomas en un documento y mantener el uso de una fuente específica para cada idioma? Esto se hace más complicado debido al hecho de que a veces las cadenas contienen una combinación de idiomas, por lo que determinar qué fuente ONE debe usarse para cada cadena no es una opción.

¿Hay alguna manera de decirle a ReportLab que use una fuente específica, y hacer retroceso a otra si faltan glifos para algunos caracteres? Encontré sugerencias vagas en los documentos de que debería ser posible, aunque podría entenderlo incorrectamente.

Alternativamente, ¿sabe de una fuente TrueType condensada que contenga los glifos de todos los idiomas europeos, hebreo, ruso, chino, japonés y árabe?

Gracias.


De Google Noto Fonts :

Google ha estado desarrollando una familia de fuentes llamada Noto, que apunta a admitir todos los idiomas con una apariencia armoniosa.

La fuente unificada Noto Sans incluye una fuente única, que admite 581 idiomas en las siguientes áreas:

Otros, como el hebreo, el árabe y el japonés, se enumeran como elementos separados en el sitio web de Noto.


Esta pregunta me fascinó toda la semana, por lo que, como es fin de semana, me lancé directamente a ella y encontré exactamente una solución a la que llamé MultiFontParagraph . Es un Paragraph normal con una gran diferencia: puede establecer exactamente un orden de reserva de fuente.

Por ejemplo, este texto japonés aleatorio que saqué de Internet utilizó el siguiente recurso de fuente "Bauhaus", "Arial", "HanaMinA" . Comprueba si la primera fuente tiene un glifo para el carácter, si es así, si no la utiliza, vuelve a la siguiente fuente. Actualmente el código no es realmente eficiente, ya que coloca etiquetas alrededor de cada personaje, esto puede solucionarse fácilmente, pero para mayor claridad no lo hice aquí.

Usando el siguiente código creé el ejemplo anterior:

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

La fuente del MultiFontParagraph (git) es la siguiente:

from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.platypus import Paragraph class MultiFontParagraph(Paragraph): # Created by B8Vrede for http://.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)