operações de fontes amigáveis em cima de fontTools
. ?
pip instalar python-fontbro
Basta importar a classe da fonte:
from fontbro import Fontfont = Font("fonts/MyFont.ttf")# ou você pode usar qualquer objeto semelhante a um arquivo: with open("fonts/MyFont.ttf") as fh:font = Font(fh)
clone
close
from_collection
get_characters
get_characters_count
get_family_classification
get_family_name
get_features
get_features_tags
get_filename
get_fingerprint
get_fingerprint_match
get_format
get_glyphs
get_glyphs_count
get_image
get_italic_angle
get_name
get_names
get_style_flag
get_style_flags
get_style_name
get_svg
get_ttfont
get_unicode_block_by_name
get_unicode_blocks
get_unicode_script_by_name
get_unicode_scripts
get_variable_axes
get_variable_axes_tags
get_variable_axis_by_tag
get_variable_instances
get_variable_instance_by_style_name
get_variable_instance_closest_to_coordinates
get_version
get_vertical_metrics
get_weight
get_width
is_color
is_monospace
is_static
is_variable
rename
sanitize
save
save_as_woff
save_as_woff2
save_to_file_object
save_variable_instances
set_family_classification
set_family_name
set_name
set_names
set_style_flag
set_style_flags
set_style_flags_by_subfamily_name
set_style_name
set_vertical_metrics
subset
to_sliced_variable
to_static
clone
"""Cria uma nova instância de Font lendo o mesmo arquivo binário."""font_clone = font.clone()
close
"""Feche a instância TTFont encapsulada."""font.close()
from_collection
"""Obtém uma lista de objetos Font de um arquivo de coleção de fontes (.ttc / .otc):param filepath: O filepath:type filepath: str ou pathlib.Path:returns: Uma lista de objetos Font.:rtype: list" "" fontes = Font.from_collection(filepath="my-font-collection.ttc")
get_characters
"""Obtém os caracteres da fonte.:param ignore_blank: Se True, caracteres sem contornos não serão retornados.:type ignore_blank: bool:returns: Os caracteres.:rtype: gerador de dicts:raises TypeError: Se não for possível encontrar o 'melhor' ditado unicode cmap na fonte."""chars = font.get_characters(ignore_blank=False)
get_characters_count
"""Obtém a contagem de caracteres da fonte.:param ignore_blank: Se True, caracteres sem contornos não serão contados.:type ignore_blank: bool:returns: A contagem de caracteres.:rtype: int"""chars_count = font.get_characters_count(ignore_blank =Falso)
get_family_classification
"""Obtém as informações de classificação da família de fontes lendo o campo sFamilyClass da tabela OS/2. Se a tabela OS/2 não estiver disponível Nenhum é retornado.:returns: Um dicionário contendo as informações de classificação da família de fontes, por exemplo, { "nome_completo": "Sans Serif / Gótico Neo-grotesco", "class_id": 8, "class_name": "Sans Serif", "subclass_id": 5, "subclass_name": "Gótico Neo-grotesco", }:rtype: dict"""family_classification = font.get_family_classification()
get_family_name
"""Obtém o nome da família lendo os registros de nome com ordem de prioridade (16, 21, 1).:returns: O nome da família da fonte.:rtype: str"""family_name = font.get_family_name()
get_features
"""Obtém os recursos do tipo aberto da fonte.:returns: Os recursos.:rtype: lista de dict"""features = font.get_features()
get_features_tags
"""Obtém as tags de recursos do opentype da fonte.:returns: A lista de tags de recursos.:rtype: lista de str"""features_tags = font.get_features_tags()
get_filename
"""Obtém o nome do arquivo a ser usado para salvar a fonte no sistema de arquivos.:param variable_suffix: O sufixo da variável, padrão "Variable":type variable_suffix: str:param variable_axes_tags: O sinalizador das tags dos eixos variáveis, se True, as tags dos eixos será anexado, por exemplo, '[wght,wdth]':type variable_axes_tags: bool:param variable_axes_values: O sinalizador de valores dos eixos variáveis se for True, os valores de cada eixo serão anexados, por exemplo, '[wght (100.100.900), wdth (75.100.125)]': type variable_axes_values: bool: returns: The filename.:rtype: str "" "filename = font .get_filename(variable_suffix="Variável", variável_axes_tags=True, variáveis_axes_values=Falso)
get_fingerprint
"""Obtém a impressão digital da fonte: um hash calculado a partir de uma representação de imagem da fonte. Alterar a opção de texto afeta a impressão digital retornada.:param text: O texto usado para gerar a impressão digital, valor padrão: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".:type text : str:returns: O hash da impressão digital.:rtype: imagehash.ImageHash"""hash = font.get_fingerprint()
get_fingerprint_match
"""Obtém a correspondência de impressão digital entre esta fonte e outra. verificando se suas impressões digitais são iguais (diferença <= tolerância).:param other: A outra fonte, pode ser um caminho de arquivo ou uma instância de fonte.:type other: str ou Font:param tolerância: A tolerância diff, padrão 3.:type tolerância: int:param text: O texto usado para gerar a impressão digital, valor padrão: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".:type text: str:returns: Uma tupla contendo as informações de correspondência (match, diff, hash, other_hash).:rtype: tuple"""match, diff, hash, other_hash = font.get_fingerprint_match(other="other_font.ttf", tolerância=10)
get_format
"""Obtém o formato da fonte: otf, ttf, woff, woff2.:param ignore_flavor: Se True, o formato original sem compactação será retornado.:type ignore_flavor: bool:returns: O formato.:rtype: str ou None" ""formato = font.get_format(ignore_flavor=False)
get_glyphs
"""Obtém os glifos da fonte e sua própria composição.:returns: Os glifos.:rtype: gerador de dictos"""glyphs = font.get_glyphs()
get_glyphs_count
"""Obtém a contagem de glifos da fonte.:returns: A contagem de glifos.:rtype: int"""glyphs_count = font.get_glyphs_count()
get_image
"""Obtém uma representação de imagem da fonte renderizando algum texto usando as opções fornecidas.:param text: O texto renderizado na imagem:type text: str:param size: O tamanho da fonte:type size: int:param color: O texto color:type color: tuple:param background_color: O plano de fundo color:type background_color: tuple"""img = font.get_image(text="Olá!", size=48, color=(0, 0, 0, 255), cor_de_fundo=(255, 255, 255, 255))
get_italic_angle
"""Obtém o ângulo da fonte em itálico.:returns: O valor do ângulo incluindo as bandeiras invertida, itálica e romana.:rtype: dict ou None"""italic_angle = font.get_italic_angle()
get_name
"""Obtém o nome pelo seu identificador da tabela de nomes de fontes.:param key: O nome id ou chave (por exemplo, "family_name"):type key: int ou str:returns: O nome.:rtype: str ou None :raises KeyError: se a chave não for um nome válido key/id"""family_name = font.get_name(key=Font.NAME_FAMILY_NAME)
get_names
"""Obtém os registros de nomes mapeados pelo nome de sua propriedade.:returns: Os nomes.:rtype: dict"""names = font.get_names()
get_style_flag
"""Obtém o sinalizador de estilo lendo tabelas OS/2 e macStyle.:param key: A chave:type key: string:returns: O sinalizador de estilo.:rtype: bool"""flag = font.get_style_flag(Font.STYLE_FLAG_BOLD)
get_style_flags
"""Obtém os sinalizadores de estilo lendo tabelas OS/2 e macStyle.:returns: O dict representando os sinalizadores de estilo.:rtype: dict"""flags = font.get_style_flags()
get_style_name
"""Obtém o nome do estilo lendo os registros de nome com ordem de prioridade (17, 22, 2).:returns: O nome do estilo da fonte.:rtype: str"""style_name = font.get_style_name()
get_svg
"""Obtém uma representação SVG da fonte que renderiza algum texto usando as opções fornecidas.:param text: O texto a ser renderizado como caminhos SVG.:type text: str:param size: O tamanho da fonte a ser usada para renderizar o text, em pontos.:type size: int:returns: Uma string SVG que representa o text.:rtype: str"""svg_str = font.get_svg(text="Hello!", tamanho=48)
get_ttfont
"""Obtém a instância TTFont encapsulada.:returns: A instância TTFont.:rtype: TTFont"""ttfont = font.get_ttfont()
get_unicode_block_by_name
"""Obtém o bloco unicode por nome (o nome não diferencia maiúsculas de minúsculas e ignora "-").:param name: O nome:type name: str:returns: O bloco unicode dita se o nome for válido, None caso contrário.: rtype: dict ou None"""block = font.get_unicode_block_by_name(name="Latim Básico")
get_unicode_blocks
"""Obtém os blocos unicode e sua cobertura.Apenas blocos com cobertura >= limite_de_cobertura (0,0 <= limite_de_cobertura <= 1,0) serão retornados.:param limite_de_cobertura: A cobertura mínima necessária para que um bloco seja retornado.:tipo limite_de_cobertura: float:returns: A lista de blocos unicode.:rtype: lista de dicts"""blocks = font.get_unicode_blocks(coverage_threshold=0,00001)
get_unicode_script_by_name
"""Obtém o script unicode por nome/tag (nome/tag não diferencia maiúsculas de minúsculas e ignora "-").:param name: O nome:type name: str:returns: O script unicode determina se o nome/tag é válido, nenhum caso contrário.:rtype: dict ou None"""script = font.get_unicode_script_by_name(name="Latn")
get_unicode_scripts
"""Obtém os scripts unicode e sua cobertura. Somente scripts com cobertura >= limite_de_cobertura (0,0 <= limite_de_cobertura <= 1,0) serão retornados.:param limite_de_cobertura: A cobertura mínima necessária para que um script seja retornado.:tipo limite_de_cobertura: float:returns: A lista de scripts unicode.:rtype: lista de dicts"""scripts = font.get_unicode_scripts(coverage_threshold=0,00001)
get_variable_axes
"""Obtém os eixos variáveis da fonte.:returns: A lista de eixos se a fonte for uma fonte variável, caso contrário, None.:rtype: lista de dict ou None"""axes = font.get_variable_axes()
get_variable_axes_tags
"""Obtém as tags dos eixos variáveis.:returns: As tags dos eixos variáveis.:rtype: list ou None"""axes_tags = font.get_variable_axes_tags()
get_variable_axis_by_tag
"""Obtém um eixo variável por tag.:param tag: A tag:type tag: string:returns: O eixo variável por tag.:rtype: dict ou None"""axis = font.get_variable_axis_by_tag(tag="wght" )
get_variable_instances
"""Obtém a variável instances.:returns: A lista de instâncias se a fonte for uma fonte variável, caso contrário None.:rtype: lista de dict ou None"""instances = font.get_variable_instances()
get_variable_instance_by_style_name
"""Obtém a instância da variável pelo nome do estilo, por exemplo. style_name = 'Bold':param style_name: O nome do estilo:type style_name: str:returns: A instância da variável que corresponde ao nome do estilo fornecido.:rtype: dict ou None"" "instância = font.get_variable_instance_by_style_name(style_name="Negrito")
get_variable_instance_closest_to_coordinates
"""Obtém a instância da variável mais próxima das coordenadas.por exemplo, coordenadas = {"wght": 1000, "slnt": 815, "wdth": 775}Se as coordenadas não especificarem alguns eixos, o valor padrão dos eixos será usado para pesquisa. :param coordenadas: As coordenadas:tipo coordenadas: dict:returns: A instância da variável mais próxima das coordenadas.:rtype: dict ou None"""instância = font.get_variable_instance_closest_to_coordinates(coordenadas={"wght": 1000, "slnt": 815, "wdth": 775})
get_version
"""Obtém a versão da fonte.:returns: O valor da versão da fonte.:rtype: float"""version = font.get_version()
get_vertical_metrics
"""Obtém as métricas verticais da fonte.:returns: Um dicionário contendo as seguintes métricas verticais: "units_per_em", "y_max", "y_min", "ascent", "descent", "line_gap", "typo_ascender", "typo_descender ", "typo_line_gap", "cap_height", "x_height", "win_ascent", "win_descent":rtype: dict"""metrics = fonte.get_vertical_metrics()
get_weight
"""Obtém o valor e o nome do peso da fonte.:returns: O nome e o valor do peso.:rtype: dict ou None"""weight = font.get_weight()
get_width
"""Obtém o valor e o nome da largura da fonte.:returns: O nome e o valor da largura.:rtype: dict ou None"""width = font.get_width()
is_color
"""Determina se a fonte é uma fonte colorida.:returns: True se a fonte for colorida, False caso contrário.:rtype: bool"""color = font.is_color()
is_monospace
"""Determina se a fonte é monoespaçada.:param limite: O limite (0,0 <= n <= 1,0) de glifos com a mesma largura para considerar a fonte como monoespaçada.:type limite: float:returns: Verdadeiro se fonte monoespaçada, Falso caso contrário.:rtype: bool"""mono = font.is_monospace(threshold=0.85)
is_static
"""Determina se a fonte é estática.:returns: True se fonte estática, False caso contrário.:rtype: bool"""static = font.is_static()
is_variable
"""Determina se a fonte é uma fonte variável.:returns: True se fonte variável, False caso contrário.:rtype: bool"""variable = font.is_variable()
rename
"""Renomeia os registros de nomes de fontes (1, 2, 4, 6, 16, 17) de acordo com o nome_da_família e o nome_do_estilo (nome_da_subfamília). Se o nome_da_família não estiver definido, ele será detectado automaticamente. ser detectado automaticamente.:param family_name: O nome da família:type family_name: str:param style_name: O nome do estilo:type style_name: str:param update_style_flags: se True, os sinalizadores de estilo serão atualizados pelo nome da subfamília: tipo update_style_flags: bool:raises ValueError: se o nome PostScript calculado tiver mais de 63 caracteres."""font.rename(family_name="My Font New", style_name ="Negrito Itálico", update_style_flags=True)
sanitize
"""Sanitize o arquivo de fonte usando OpenType Sanitizer.https://github.com/googlefonts/ots-python:param strict: se True (padrão), gera uma exceção mesmo em avisos do sanitizer. Se False, gera apenas uma exceção em falha do sanitizador (código de saída diferente de zero).:type strict: bool:raises Exceção: se o OpenType Sanitizer relatar um erro durante o processo de sanitização.:return: None:note: Usa OpenType Sanitizer (ots) para limpar o arquivo de fonte Salva a fonte em um diretório temporário e invoca o sanitizer no arquivo salvo. Se `strict` for True (padrão), trata os avisos do sanitizer como erros. , verifica apenas erros de desinfetante."""font.sanitize(strict=True)
save
"""Salva a fonte no caminho do arquivo.:param filepath: O caminho do arquivo, se Nenhum, o caminho do arquivo de origem será usado:type filepath: str ou None:param overwrite: A substituição, se True, o arquivo da fonte de origem pode ser substituído:type overwrite : bool: returns: O caminho do arquivo onde a fonte foi salva.: rtype: str: raises ValueError: Se o caminho do arquivo for o mesmo da fonte de origem e a substituição não for permitido."""saved_font_path = font.save(filepath=Nenhum, overwrite=False)
save_as_woff
"""Salva a fonte como woff.:param filepath: O caminho do arquivo:type filepath: str:param overwrite: A substituição, se True o arquivo da fonte de origem pode ser substituído:type overwrite: bool:returns: O caminho do arquivo onde a fonte foi salvo em.:rtype: str"""saved_font_path = font.save_as_woff(filepath=None, overwrite=True)
save_as_woff2
"""Salva a fonte como woff2.:param filepath: O caminho do arquivo:type filepath: str:param overwrite: A substituição, se True o arquivo da fonte de origem pode ser substituído:type overwrite: bool:returns: O caminho do arquivo onde a fonte foi salvo em.:rtype: str"""saved_font_path = font.save_as_woff2(filepath=None, overwrite=True)
save_to_fileobject
"""Grava a fonte em um objeto semelhante a um arquivo. Se nenhum objeto de arquivo for passado, uma instância de `BytesIO` será criada para o usuário.:param fileobject: Um objeto semelhante a um arquivo para gravar.:returns: O arquivo objeto que foi originalmente passado ou um novo BytesIOinstance.:rtype: digitando.io.IO"""fileobject = font.save_to_fileobject(fileobject=None)
save_variable_instances
"""Salve todas as instâncias de uma fonte variável no diretório especificado em um ou mais formatos.:param dirpath: O dirpath:type dirpath: O caminho do diretório onde as instâncias serão salvas.:param woff2: Se as instâncias devem ser salvas também no formato WOFF2 O padrão é True.:type woff2: bool:param woff: Se as instâncias também devem ser salvas no formato WOFF. O padrão é True.:type woff: bool:param. overwrite: Se deve sobrescrever os arquivos existentes no diretório. O padrão é True.:type overwrite: bool:param options: Opções adicionais a serem passadas para o instanciador ao gerar instâncias estáticas.:type options: Dictionary:returns: Uma lista contendo dicionários para cada instância salva. Cada dicionário inclui 'instância' (contendo metadados de instância) e 'arquivos' (um dicionário com formatos de arquivo como chaves e caminhos de arquivo como valores).:raises TypeError: Se a fonte não for uma variável. fonte."""saved_fonts = font.save_variable_instances(dirpath, woff2=True, woff=True, overwrite=True, **opções)
set_family_classification
"""Define a classificação da família de fontes (sFamilyClass na tabela OS/2) com base no class_id e subclass_id fornecidos.:param class_id: identificador numérico da classe da família de fontes.:param subclass_id: identificador numérico opcional da subclasse da família de fontes (o padrão é 0).:raises OperationError: Se a tabela OS/2 não estiver disponível na fonte.:raises ArgumentError: Se class_id for inválido ou subclass_id é especificado, mas inválido."""font.set_family_classification(**font.FAMILY_CLASSIFICATION_SCRIPTS_CALLIGRAPHIC)# alternativamente:font.set_family_classification(class_id=10, subclass_id=5)
set_family_name
"""Define o nome da família atualizando os registros de nomes de fontes relacionados.:param name: O nome:type name: O novo nome da família."""font.set_family_name(name="My Font New")
set_name
"""Define o nome por seu identificador na tabela de nomes de fontes.:param key: O nome id ou chave (por exemplo, "family_name"):type key: int ou str:param value: O valor:type value: str" ""font.set_name(Font.NAME_FAMILY_NAME, "Nome de família renomeado")
set_names
"""Define os nomes por seu identificador na tabela de nomes.:param nomes: Os nomes:tipo nomes: dict"""font.set_names(names={Font.NAME_FAMILY_NAME: "Nome de família renomeado",Font.NAME_SUBFAMILY_NAME: " Regular renomeado", })
set_style_flag
"""Define o sinalizador de estilo.:param key: O sinalizador key:type key: str:param value: O valor:type value: bool"""font.set_style_flag(Font.STYLE_FLAG_BOLD, True)
set_style_flags
"""Define os sinalizadores de estilo, os sinalizadores definidos como Nenhum serão ignorados.:param negrito: O valor do sinalizador em negrito.:type negrito: bool ou Nenhum:param itálico: O valor do sinalizador em itálico.:type itálico: bool ou Nenhum:param sublinhado: O valor do sinalizador de sublinhado.: tipo sublinhado: bool ou Nenhum: param contorno: O valor do sinalizador de contorno.: tipo contorno: bool ou Nenhum"""font.set_style_flags(regular=Nenhum, negrito=Nenhum, itálico=Nenhum, contorno=Nenhum, sublinhado=Nenhum)
set_style_flags_by_subfamily_name
"""Define os sinalizadores de estilo pelo valor do nome da subfamília. Os valores da subfamília devem ser "regular", "itálico", "negrito" ou "negrito itálico"para permitir que este método funcione corretamente."""font.set_style_flags_by_subfamily_name()
set_style_name
"""Define o nome do estilo atualizando os registros de nomes de fontes relacionados.:param name: O nome:type name: O novo nome do estilo."""font.set_style_name(name="Bold Italic")
set_vertical_metrics
"""Define as métricas verticais.:param métricas: Argumentos de palavras-chave que representam as métricas verticais que podem ser definidas: "units_per_em", "y_max", "y_min", "ascent", "descent", "line_gap", "typo_ascender" , "typo_descender", "typo_line_gap", "cap_height", "x_height", "win_ascent", "win_descent""""font.set_vertical_metrics(units_per_em=2000, y_max=2102, y_min=-533, subida=1800, descida=-400, line_gap=0, typo_ascender=1800, typo_descender=-400, typo_line_gap=0, cap_height =1400, x_height=1080, win_ascent=2160, win_descent=540)
subset
""" Subconfigura a fonte usando as opções fornecidas (unicodes ou glifos ou texto), é possível passar também opções de subconjuntos, mais informações aqui: https://github.com/fonttools/fonttools/blob/main/Lib/fontTools /subset/__init__.py:param unicodes: Os unicodes:type unicodes: str ou list:param glifos: Os glifos:type glifos: list:param text: O text:type text: str:param options: O subconjunto options:type options: dict"""font.subset(unicodes="", glyphs=[], text="", ** opções)
to_sliced_variable
"""Converte a fonte variável em uma fonte parcial, fatiando os eixos variáveis nas coordenadas fornecidas. Se um valor de eixo não for especificado, o eixo permanecerá inalterado. Se os valores mínimo e máximo de um eixo forem iguais, o eixo será fixado .:coordenadas param: O dicionário de coordenadas, cada valor de item deve ser tuple/list/dict (com chaves 'min', 'default' e 'max') para fatiar ou float/int para fixar, por exemplo. {'wdth':100, 'wght':(100.600), 'ital':(30,65,70)} ou {'wdth':100, 'wght':[100.600], 'ital':[30, 65,70]} ou {'largura':100, 'wght':{'min':100,'max':600}, 'ital':{'min':30,'default':65,'max':70}}:type coordenadas: dict:param opções : As opções para fontTools.varLib.instancer:type opções: dicionário:raises TypeError: Se a fonte não for uma variável font:raises ValueError: Se as coordenadas não estiverem definidas (vazio): aumenta ValueError: Se os eixos de coordenadas estiverem todos fixados"""font.to_sliced_variable(coordenadas, **opções)
to_static
"""Converte a fonte variável em uma fonte estática, fixando os eixos variáveis nas coordenadas fornecidas. Se um valor de eixo não for especificado, o eixo será fixado em seu valor padrão. Se as coordenadas não forem especificadas, cada eixo será fixado em seu valor padrão. value.:param coordenadas: As coordenadas, por exemplo. {'wght':500, 'ital':50}:type coordenadas: dict ou None:param style_name: O nome do estilo da instância existente, por exemplo, 'Black':type style_name: str ou None:param update_names: se True os registros de nome serão atualizados com base na instância mais próxima:type update_names: bool:param update_style_flags: se True os sinalizadores de estilo serão atualizados com base na instância mais próxima: type update_style_flags: bool:param options: As opções para fontTools.varLib.instancer:type options: Dictionary:raises TypeError: Se a fonte não for um variável font:raises ValueError: Se os eixos de coordenadas não estiverem todos fixados"""font.to_static(coordinates=None, style_name=None, update_names=True, update_style_flags=True, **options)
# clone repositóriogit clone https://github.com/fabiocaccamo/python-fontbro.git && cd python-fontbro# crie virtualenv e ative itpython -m venv venv && . venv/bin/activate# atualizar pippython -m pip install --upgrade pip# instalar requisitospython -m pip install -r requisitos.txt -r requisitos-test.txt# instalar pré-commit para executar formatadores e linterspre-commit install -- install-hooks# execute testes usando toxtox# ou execute testes usando unittestpython -m unittest
Lançado sob licença MIT.
Agradecimentos especiais a Jérémie Hornus e Just Van Rossum.
Marque este projeto com estrela no GitHub
Siga-me no GitHub
? Siga-me no Twitter
? Patrocine-me no Github
python-benedict
- subclasse dict com suporte a keylist/keypath, atalhos de E/S (base64, csv, json, pickle, plist, query-string, toml, xml, yaml) e muitos utilitários.
python-fsutil
– utilitários de sistema de arquivos para desenvolvedores preguiçosos. ?♂️