удобные операции со шрифтами поверх fontTools
. ?
pip установить python-fontbro
Просто импортируйте класс шрифта:
from fontbro import Fontfont = Font("fonts/MyFont.ttf")# или вы можете использовать любой файлоподобный объект: with open("fonts/MyFont.ttf") в качестве 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
"""Создает новый экземпляр шрифта, читающий тот же двоичный файл."""font_clone = font.clone()
close
"""Закройте завернутый экземпляр TTFont."""font.close()
from_collection
"""Получает список объектов Font из файла коллекции шрифтов (.ttc / .otc):param filepath: Путь к файлу:type filepath: str или pathlib.Path:возвращает: Список объектов Font.:rtype: list" ""fonts = Font.from_collection(filepath="my-font-collection.ttc")
get_characters
"""Получает символы шрифта.:param ignore_blank: Если True, символы без контуров не будут возвращены.:type ignore_blank: bool:returns: Символы.:rtype: генератор диктов:поднимает TypeError: Если невозможно найти «лучший» словарь cmap для Юникода в шрифте."""chars = font.get_characters(ignore_blank=False)
get_characters_count
"""Получает количество символов шрифта.:param ignore_blank: Если True, символы без контуров не будут учитываться.:type ignore_blank: bool:returns: Количество символов.:rtype: int"""chars_count = font.get_characters_count(ignore_blank = Ложь)
get_family_classification
"""Получает информацию о классификации семейства шрифтов, читая поле sFamilyClass из таблицы OS/2. Если таблица OS/2 недоступна, возвращается None.:returns: Словарь, содержащий информацию о классификации семейства шрифтов, например { "full_name": "Без засечек/неогротескная готика", "class_id": 8, "class_name": "Sans Serif", "subclass_id": 5, "subclass_name": "Неогротескная готика", }:rtype: dict"""family_classification = font.get_family_classification()
get_family_name
"""Получает имя семейства, читая записи имен в порядке приоритета (16, 21, 1).:returns: Имя семейства шрифтов.:rtype: str"""family_name = font.get_family_name()
get_features
"""Получает функции opentype шрифта.:returns: Функции.:rtype: список dict"""features = font.get_features()
get_features_tags
"""Получает теги функций opentype шрифта.:returns: Список тегов функций.:rtype: список str"""features_tags = font.get_features_tags()
get_filename
"""Получает имя файла, которое будет использоваться для сохранения шрифта в файловой системе.:paramvariable_suffix: суффикс переменной, по умолчанию "Variable":typevariable_suffix:str:paramvariable_axes_tags: флаг тегов переменных осей, если True, теги осей будет добавлен, например, '[wght,wdth]':typevariable_axes_tags: bool:param variable_axes_values: флаг значений переменных осей. Если True, значения каждой оси будут добавлены, например, '[wght(100,100,900),wdth(75,100,125)]':typevariable_axes_values: bool:returns: Имя файла.:rtype: str"""filename = font.get_filename(variable_suffix="Переменная", variable_axes_tags=True,variable_axes_values=False)
get_fingerprint
"""Получает отпечаток шрифта: хэш, рассчитанный на основе графического представления шрифта. Изменение параметра текста влияет на возвращаемый отпечаток.:param text: Текст, используемый для создания отпечатка, значение по умолчанию: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".:type text : str:returns: Хэш отпечатка пальца.:rtype: imagehash.ImageHash"""hash = font.get_fingerprint()
get_fingerprint_match
"""Получает совпадение отпечатков пальцев между этим шрифтом и другим. Проверяя, равны ли их отпечатки (разница <= допуск).:paramother: Другой шрифт может быть либо путем к файлу, либо экземпляром шрифта.:typeother: str или Font:param допуск: допуск различий, по умолчанию 3.:допуск типа: int:param text: текст, используемый для генерации отпечатка пальца, значение по умолчанию: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".:type text: str:returns: Кортеж, содержащий информацию о совпадении (match, diff, hash,other_hash).:rtype: tuple"""match, diff, hash,other_hash = font.get_fingerprint_match(other="other_font.ttf", допуск=10)
get_format
"""Получает формат шрифта: otf, ttf, woff, woff2.:param ignore_flavor: Если True, будет возвращен исходный формат без сжатия.:type ignore_flavor: bool:returns: Формат.:rtype: str или None" ""format = font.get_format(ignore_flavor=False)
get_glyphs
"""Получает глифы шрифта и их собственную композицию.:returns: Глифы.:rtype: генератор диктов"""glyphs = font.get_glyphs()
get_glyphs_count
"""Получает количество глифов шрифта.:returns: Количество глифов.:rtype: int"""glyphs_count = font.get_glyphs_count()
get_image
"""Получает представление изображения шрифта, отображающего текст с использованием заданных параметров.:param text: Текст, отображаемый на изображении:type text: str:param size: Размер шрифта:type size: int:param color: Текст цвет:тип цвет: кортеж:параметр фон_цвет: Цвет фона:тип фон_цвет: кортеж"""img = font.get_image(text="Привет!", размер=48, цвет=(0, 0, 0, 255), цвет фона = (255, 255, 255, 255))
get_italic_angle
"""Получает угол наклона шрифта.:returns: Значение угла, включая обратный наклон, курсив и римские флаги.:rtype: dict или None"""italic_angle = font.get_italic_angle()
get_name
"""Получает имя по его идентификатору из таблицы имен шрифтов.:param key: идентификатор имени или ключ (например, "family_name"):type key: int или str:возвращает: имя.:rtype: str или None : поднимает KeyError: если ключ не является допустимым именем key/id """family_name = font.get_name(key=Font.NAME_FAMILY_NAME)
get_names
"""Получает записи имен, сопоставленные с именем их свойства.:returns: Имена.:rtype: dict"""names = font.get_names()
get_style_flag
"""Получает флаг стиля чтения таблиц OS/2 и macStyle.:param key: Ключ:type key: string:returns: Флаг стиля.:rtype: bool"""flag = font.get_style_flag(Font.STYLE_FLAG_BOLD)
get_style_flags
"""Получает флаги стилей для чтения таблиц OS/2 и macStyle.:returns: dict, представляющий флаги стилей.:rtype: dict"""flags = font.get_style_flags()
get_style_name
"""Получает имя стиля, читая записи имен в порядке приоритета (17, 22, 2).:returns: Имя стиля шрифта.:rtype: str"""style_name = font.get_style_name()
get_svg
"""Получает SVG-представление шрифта, отображающего некоторый текст, используя заданные параметры.:param text: Текст, который будет отображаться как пути SVG.:type text: str:param size: Размер шрифта, который будет использоваться для рендеринга текст, в пунктах.:type size: int:returns: строка SVG, представляющая отображаемый текст.:rtype: str"""svg_str = font.get_svg(text="Привет!", size=48)
get_ttfont
"""Получает упакованный экземпляр TTFont.:returns: Экземпляр TTFont.:rtype: TTFont"""ttfont = font.get_ttfont()
get_unicode_block_by_name
"""Получает блок Юникода по имени (имя не чувствительно к регистру и игнорирует "-").:param name: Имя:имя типа: строка:возвращает: Блок Юникода определяет, если имя допустимо, в противном случае - None.: rtype: dict или None"""block = font.get_unicode_block_by_name(name="Basic Latin")
get_unicode_blocks
"""Получает блоки Юникода и их покрытие. Будут возвращены только блоки с покрытием >= Cover_threshold (0,0 <= Cover_threshold <= 1,0).:param Cover_threshold: Минимально необходимое покрытие для возвращаемого блока.:type Coverage_threshold: float:returns: Список блоков Юникода.:rtype: список dicts"""blocks = font.get_unicode_blocks(coverage_threshold=0.00001)
get_unicode_script_by_name
"""Получает сценарий Юникода по имени/тегу (имя/тег не чувствителен к регистру и игнорирует "-").:param name: Имя:имя типа: str:возвращает: Сценарий Юникода определяет, если имя/тег допустимо, в противном случае нет.:rtype: dict или None"""script = font.get_unicode_script_by_name(name="Latn")
get_unicode_scripts
"""Получает сценарии Юникода и их покрытие. Будут возвращены только сценарии с покрытием >= Coverage_threshold (0,0 <= Cover_threshold <= 1,0).:paramcover_threshold: Минимально необходимое покрытие для возвращаемого скрипта.:typecover_threshold: float:returns: Список скриптов Юникода.:rtype: список dicts"""scripts = font.get_unicode_scripts(coverage_threshold=0.00001)
get_variable_axes
"""Получает оси переменных шрифта.:returns: Список осей, если шрифт является переменным шрифтом, в противном случае None.:rtype: список dict или None """axes = font.get_variable_axes()
get_variable_axes_tags
"""Получает теги переменных осей.:returns: Теги переменных осей.:rtype: list или None"""axes_tags = font.get_variable_axes_tags()
get_variable_axis_by_tag
"""Получает переменную ось по тегу.:param tag: Тег:type tag: string:returns: Переменная ось по тегу.:rtype: dict или None"""axis = font.get_variable_axis_by_tag(tag="wght" )
get_variable_instances
"""Получает экземпляры переменных.:returns: Список экземпляров, если шрифт является переменным шрифтом, в противном случае None.:rtype: список dict или None"""instances = font.get_variable_instances()
get_variable_instance_by_style_name
"""Получает экземпляр переменной по имени стиля, например. style_name = 'Bold':param style_name: Имя стиля:type style_name: str:returns: Экземпляр переменной, соответствующий заданному имени стиля.:rtype: dict или None"" "instance = font.get_variable_instance_by_style_name(style_name="Bold")
get_variable_instance_closest_to_coordinates
"""Получает экземпляр переменной, ближайший к координатам, например, координаты = {"wght": 1000, "slnt": 815, "wdth": 775}Если в координатах не указаны некоторые оси, для поиска используется значение осей по умолчанию. :param координаты: координаты:тип координат: dict:returns: экземпляр переменной, ближайший к координатам.:rtype: dict или None"""экземпляр = font.get_variable_instance_closest_to_coordinates(coordinates={"wght": 1000, "slnt": 815, "wdth": 775})
get_version
"""Получает версию шрифта.:returns: Значение версии шрифта.:rtype: float"""version = font.get_version()
get_vertical_metrics
"""Получает вертикальные метрики шрифта.:returns: Словарь, содержащий следующие вертикальные метрики: "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 = font.get_vertical_metrics()
get_weight
"""Получает значение и имя толщины шрифта.:returns: Имя и значение толщины.:rtype: dict или None """weight = font.get_weight()
get_width
"""Получает значение и имя ширины шрифта.:returns: Имя и значение ширины.:rtype: dict или None """width = font.get_width()
is_color
"""Определяет, является ли шрифт цветным.:returns: True, если цветной шрифт, False в противном случае.:rtype: bool"""color = font.is_color()
is_monospace
"""Определяет, является ли шрифт моноширинным.:param порог: Порог (0,0 <= n <= 1,0) для глифов одинаковой ширины, позволяющий считать шрифт моноширинным.:type порог: float:returns: True if моноширинный шрифт, в противном случае — False.:rtype: bool"""mono = font.is_monospace(threshold=0.85)
is_static
"""Определяет, является ли шрифт статическим.:returns: True, если статический шрифт, False в противном случае.:rtype: bool"""static = font.is_static()
is_variable
"""Определяет, является ли шрифт переменным шрифтом.:returns: True, если переменный шрифт, False в противном случае.:rtype: bool"""variable = font.is_variable()
rename
"""Переименовывает записи названий шрифтов (1, 2, 4, 6, 16, 17) в соответствии с заданным именем_семейства и именем_стиля (имя_подсемейства). Если имя_семейства не определено, оно будет обнаружено автоматически. Если имя_стиля не определено, оно будет определяться автоматически.:param имя_семейства: Имя семейства:тип имя_семейства: str:параметр имя_стиля: Имя стиля:тип имя_стиля: str:param update_style_flags: если True, флаги стиля будут обновлены по имени подсемейства:type update_style_flags: bool:raises ValueError: если вычисленное имя PostScript длиннее 63 символов."""font.rename(family_name="My Font New" ", style_name="Жирный курсив", update_style_flags=True)
sanitize
"""Очистите файл шрифта с помощью OpenType Sanitizer.https://github.com/googlefonts/ots-python:param strict: Если True (по умолчанию), вызывает исключение даже для предупреждений дезинфицирующего средства. Если False, вызывает исключение только для сбой дезинфицирующего средства (ненулевой код выхода).:type strict: bool:raises Исключение: если OpenType Sanitizer сообщает об ошибке во время процесса санации.:return: Нет: примечание: использует OpenType Sanitizer (ots) для очистки файла шрифта. Сохраняет шрифт во временный каталог и вызывает очиститель для сохраненного файла. Если `strict` имеет значение True (по умолчанию), предупреждения дезинфицирующего средства рассматриваются как ошибки. strict` имеет значение False, проверяет только наличие ошибок дезинфицирующего средства."""font.sanitize(strict=True)
save
"""Сохраняет шрифт по пути к файлу.:param filepath: Путь к файлу, если нет, будет использоваться исходный путь к файлу: введите путь к файлу: str или None:param overwrite: Перезапись, если True, исходный файл шрифта может быть перезаписан: введите overwrite : bool:returns: Путь к файлу, в котором был сохранен шрифт.:rtype: str:raises ValueError: Если путь к файлу совпадает с исходным шрифтом и перезапись невозможна. разрешено."""saved_font_path = font.save(filepath=None, overwrite=False)
save_as_woff
"""Сохраняет шрифт как woff.:param filepath: Путь к файлу:type filepath: str:param overwrite: Перезапись, если True, исходный файл шрифта может быть перезаписан:type overwrite: bool:returns: Путь к файлу, в котором находился шрифт сохранено в.:rtype: str"""saved_font_path = font.save_as_woff(filepath=None, overwrite=True)
save_as_woff2
"""Сохраняет шрифт как woff2.:param filepath: Путь к файлу:type filepath: str:param overwrite: Перезапись, если True, исходный файл шрифта может быть перезаписан:type overwrite: bool:returns: Путь к файлу, в котором находился шрифт сохранено в.:rtype: str"""saved_font_path = font.save_as_woff2(filepath=None, overwrite=True)
save_to_fileobject
"""Записывает шрифт в файлоподобный объект. Если файловый объект не передается, для пользователя создается экземпляр `BytesIO`.:param fileobject: Файлоподобный объект для записи.:returns: Файл объект, который изначально был передан, или новый BytesIOinstance.:rtype: typing.io.IO"""fileobject = font.save_to_fileobject(fileobject=None)
save_variable_instances
"""Сохраните все экземпляры переменного шрифта в указанном каталоге в одном или нескольких форматах.:param dirpath: Путь к каталогу:type dirpath: Путь к каталогу, в котором будут сохранены экземпляры.:param woff2: Сохранять ли экземпляры также в формате WOFF2. Значение по умолчанию — True.:type woff2: bool:param woff: Сохранять ли экземпляры также в формате WOFF. Значение по умолчанию — True.:type woff: bool:param. overwrite: перезаписывать ли существующие файлы в каталоге. Значение по умолчанию — True.:type overwrite: bool:param options: Дополнительные параметры, которые будут переданы экземпляру при создании статических экземпляров.:type options: словарь:возвращает: Список, содержащий словари для каждый сохраненный экземпляр. Каждый словарь включает в себя «экземпляр» (содержащий метаданные экземпляра) и «файлы» (словарь с форматами файлов в качестве ключей и путями к файлам в качестве значений).: поднимает TypeError: Если шрифт не является переменной. шрифт."""saved_fonts = font.save_variable_instances(dirpath, woff2=True, woff=True, overwrite=True, **options)
set_family_classification
"""Задает классификацию семейства шрифтов (sFamilyClass в таблице OS/2) на основе предоставленных class_id и subclass_id.:param class_id: Числовой идентификатор класса семейства шрифтов.:param subclass_id: Необязательный числовой идентификатор подкласса семейства шрифтов (по умолчанию: 0).:raises OperationError: Если таблица OS/2 недоступна в шрифте.:raises ArgumentError: Если class_id недействителен или указан subclass_id, но неверно."""font.set_family_classification(**font.FAMILY_CLASSIFICATION_SCRIPTS_CALLIGRAPHIC)# альтернативно:font.set_family_classification(class_id=10, subclass_id=5)
set_family_name
"""Задает имя семейства, обновляя соответствующие записи имен шрифтов.:param name: Имя:type name: новое имя семейства."""font.set_family_name(name="My Font New")
set_name
"""Задает имя по его идентификатору в таблице имен шрифтов.:param key: идентификатор имени или ключ (например, "family_name"):type key: int или str:param value: значение:type value: str" ""font.set_name(Font.NAME_FAMILY_NAME, "Фамилия переименована")
set_names
"""Устанавливает имена по их идентификаторам в таблице имен.:param name: Имена:typenames: dict"""font.set_names(names={Font.NAME_FAMILY_NAME: "Family Name Renamed",Font.NAME_SUBFAMILY_NAME: " Обычное переименование", })
set_style_flag
"""Устанавливает флаг стиля.:ключ параметра: Ключ флага:ключ типа: значение str:param: Значение:значение типа: bool"""font.set_style_flag(Font.STYLE_FLAG_BOLD, True)
set_style_flags
"""Устанавливает флаги стиля, флаги, для которых установлено значение Нет, будут игнорироваться.:param жирный шрифт: значение флага, выделенное жирным шрифтом.:тип жирного шрифта: bool или None:param курсив: значение флага, выделенное курсивом.:тип курсив: bool или None:param подчеркивание: значение флага подчеркивания.:type подчеркивание: bool или None:param контур: значение флага контура.:type контур: bool или Нет """font.set_style_flags(regular=Нет, жирный шрифт=Нет, курсив=Нет, контур=Нет, подчеркивание=Нет)
set_style_flags_by_subfamily_name
"""Устанавливает флаги стиля по значению имени подсемейства. Чтобы этот метод работал правильно, значения подсемейства должны быть "обычными", "курсивом", "жирным" или "жирным курсивом".""font.set_style_flags_by_subfamily_name()
set_style_name
"""Задает имя стиля, обновляя соответствующие записи имен шрифтов.:param name: Имя:type name: новое имя стиля."""font.set_style_name(name="Bold Italic")
set_vertical_metrics
"""Устанавливает вертикальные метрики.:param metrics: Аргументы ключевых слов, представляющие вертикальные метрики, которые можно установить: "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, ascent=1800, descent=-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
""" Подбирает шрифт, используя заданные параметры (юникоды, глифы или текст), можно также передать параметры подмножества, дополнительную информацию здесь: https://github.com/fonttools/fonttools/blob/main/Lib/fontTools /subset/__init__.py:param unicodes: Unicodes:type unicodes: str или list:param глифы: глифы: тип глифов: список: параметр текст: Текст: тип текста: стр: параметры параметра: Опции подмножества: параметры типа: dict"""font.subset(unicodes="", glyphs=[], text="" , **параметры)
to_sliced_variable
"""Преобразует переменный шрифт в частичный, разрезая переменные оси по заданным координатам. Если значение оси не указано, ось останется нетронутой. Если минимальные и максимальные значения оси равны, ось будет закреплена. .:param координаты: словарь координат, каждое значение элемента должно быть кортежем/списком/диктантом (с ключами «min», «default» и «max») для нарезки или плавающим/целым для закрепления, например. {'wdth':100, 'wght':(100,600), 'ital':(30,65,70)} или {'wdth':100, 'wght':[100,600], 'ital':[30, 65,70]} или {'ширина':100, 'wght':{'min':100,'max':600}, 'ital':{'min':30,'default':65,'max':70}}:координаты типа: параметры dict:param : Параметры для fontTools.varLib.instancer:type options: словарь: поднимает TypeError: Если шрифт не является переменной. Font: поднимает ValueError: Если координаты не определены. (пусто): вызывает ValueError: если все оси координат закреплены"""font.to_sliced_variable(coordinates, **options)
to_static
"""Преобразует переменный шрифт в статический, закрепляя переменные оси в заданных координатах. Если значение оси не указано, ось будет закреплена со значением по умолчанию. Если координаты не указаны, каждая ось будет закреплена по умолчанию. значение.:координаты параметра: координаты, например {'wght':500, 'ital':50}:координаты типа: dict или None:param style_name: существующее имя стиля экземпляра, например, 'Black': введите style_name: str или None: param update_names: если True, записи имен будут обновлены на основе ближайшего экземпляра: введите update_names: bool:param update_style_flags: если True, флаги стиля будут обновлены на основе ближайшего экземпляра: тип update_style_flags: bool: параметры параметра: параметры для FontTools.varLib.instancer: параметры типа: словарь: вызывает TypeError: если шрифт не является переменной font:raises ValueError: если не все оси координат закреплены"""font.to_static(coordinates=None, style_name=None, update_names=True, update_style_flags=True, **options)
# клонировать репозиторий клон https://github.com/fabiocaccamo/python-fontbro.git && cd python-fontbro# создать virtualenv и активировать его. Python -m venv venv && . venv/bin/activate#upgrade pippython -m pip install --upgrade pip# install requirepython -m pip install -r требования.txt -r требования-test.txt# install pre-commit для запуска форматировщиков и linterspre-commit install -- install-hooks# запускайте тесты с помощью toxtox# или запускайте тесты с помощью unittestpython -m unittest
Выпущено под лицензией MIT.
Особая благодарность Жереми Хорнусу и Джасту Ван Россуму.
Отметьте этот проект на GitHub
Следуйте за мной на GitHub
? Следуйте за мной в Твиттере
? Спонсорьте меня на Github
python-benedict
— подкласс dict с поддержкой списка ключей/ключевых путей, ярлыков ввода-вывода (base64, csv, json, Pickle, plist, строки запроса, toml, xml, yaml) и множества утилит.
python-fsutil
— утилиты файловой системы для ленивых разработчиков. ?♂️