Python3如何安装.ttf字体文件?

问题描述 投票:0回答:3

我想用 python3(更精确的 Python 3.6)代码在 Windows 10 上安装 .ttf 字体文件,我用 google 搜索,但我发现的唯一的就是这个 用 python 在 Windows 上安装 TTF 字体,我测试了它,但没有什么都不做。有没有办法用python3代码安装.ttf?

提前致谢。

python python-3.x truetype
3个回答
7
投票

这个库看起来很有前途(我自己还没有尝试过)。

安装

pip install --user fonttools

pip3 install --user fonttools

代码

from fontTools.ttLib import TTFont
font = TTFont('/path/to/font.ttf')

然后使用

font.save
方法:

定义:font.save(self, file, reorderTables=True)

文档字符串:保存 字体到磁盘。与构造函数类似,“文件”参数 可以是路径名或可写文件对象。


1
投票

这可能对您有帮助,它会尝试在文件夹中安装所有字体,但您可以修改它以仅使用

install_font
功能安装 1 种字体:https://gist.github.com/tushortz/598bf0324e37033ed870c4e46461fb1e

import os
import shutil
import ctypes
from ctypes import wintypes
import sys
import ntpath
try:
    import winreg
except ImportError:
    import _winreg as winreg

user32 = ctypes.WinDLL('user32', use_last_error=True)
gdi32 = ctypes.WinDLL('gdi32', use_last_error=True)

FONTS_REG_PATH = r'Software\Microsoft\Windows NT\CurrentVersion\Fonts'

HWND_BROADCAST = 0xFFFF
SMTO_ABORTIFHUNG = 0x0002
WM_FONTCHANGE = 0x001D
GFRI_DESCRIPTION = 1
GFRI_ISTRUETYPE = 3

def install_font(src_path):
    # copy the font to the Windows Fonts folder
    dst_path = os.path.join(os.environ['SystemRoot'], 'Fonts',
                            os.path.basename(src_path))
    shutil.copy(src_path, dst_path)
    # load the font in the current session
    if not gdi32.AddFontResourceW(dst_path):
        os.remove(dst_path)
        raise WindowsError('AddFontResource failed to load "%s"' % src_path)
    # notify running programs
    user32.SendMessageTimeoutW(HWND_BROADCAST, WM_FONTCHANGE, 0, 0,
                               SMTO_ABORTIFHUNG, 1000, None)
    # store the fontname/filename in the registry
    filename = os.path.basename(dst_path)
    fontname = os.path.splitext(filename)[0]
    # try to get the font's real name
    cb = wintypes.DWORD()
    if gdi32.GetFontResourceInfoW(filename, ctypes.byref(cb), None,
                                  GFRI_DESCRIPTION):
        buf = (ctypes.c_wchar * cb.value)()
        if gdi32.GetFontResourceInfoW(filename, ctypes.byref(cb), buf,
                                      GFRI_DESCRIPTION):
            fontname = buf.value
    is_truetype = wintypes.BOOL()
    cb.value = ctypes.sizeof(is_truetype)
    gdi32.GetFontResourceInfoW(filename, ctypes.byref(cb),
                               ctypes.byref(is_truetype), GFRI_ISTRUETYPE)
    if is_truetype:
        fontname += ' (TrueType)'
    with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, FONTS_REG_PATH, 0,
                        winreg.KEY_SET_VALUE) as key:
        winreg.SetValueEx(key, fontname, 0, winreg.REG_SZ, filename)

本质上,使用 Windows AddFontResourceW

 API 中的 
gdi32
 加载字体并使用 
SendMessage
API 通知正在运行的程序 - 这将使字体在正在运行的程序中可见。

要将字体永久安装到 Windows 中,您需要将字体文件复制到 Fonts 文件夹(C:\Windows\Fonts,或 %userprofile%\AppData\Local\Microsoft\Windows\Fonts 对于每用户文件夹),然后添加注册表中的键位于

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts
(或针对每个用户的 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts安装)。


0
投票

我不知道它是否有帮助,但我仍然会在这里发布:

我有一个批处理文件:

@ECHO OFF
TITLE Adding Fonts..
REM Filename: ADD_Fonts.cmd
REM Script to ADD TrueType and OpenType Fonts for Windows
REM By Islam Adel
REM 2012-01-16

REM How to use:
REM Place the batch file inside the folder of the font files OR:
REM Optional Add source folder as parameter with ending backslash and dont use quotes, spaces are allowed
REM example "ADD_fonts.cmd" C:\Folder 1\Folder 2\

IF NOT "%*"=="" SET SRC=%*
SET SRC=%~dp0
ECHO SRC=%SRC%
ECHO.
ECHO Adding Fonts..
ECHO.
FOR /F %%i in ('dir /b "%SRC%*.ttf"') DO CALL :FONT %%i
REM OPTIONAL REBOOT
REM shutdown -r -f -t 10 -c "Reboot required for Fonts installation"
ECHO.
ECHO Done!
PAUSE
EXIT

:FONT
ECHO.
REM ECHO FILE=%~f1
SET FFILE=%~n1%~x1
SET FNAME=%~n1
SET FNAME=%FNAME:-= %
IF "%~x1"==".otf" SET FTYPE=(OpenType)
IF "%~x1"==".ttf" SET FTYPE=(TrueType)

ECHO FILE=%FFILE%
ECHO NAME=%FNAME%
ECHO TYPE=%FTYPE%


COPY /Y "%SRC%%~n1%~x1" "%SystemRoot%\Fonts\"
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "%FNAME% %FTYPE%" /t REG_SZ /d "%FFILE%" /f
GOTO :EOF

然后我创建了该批次的快捷链接,并在“属性”>“高级”中设置“始终以管理员身份执行”

Batch and ttf folder

批处理及其快捷方式和要安装的字体必须位于同一目录中!

然后在我的 Python 脚本中:

import os

font_dir = "C:/Windows/Fonts/MyFont.ttf"

if not os.path.exists(font_dir):
    os.system('start fonts/addfont.lnk')

也许这对试图实现这一目标的人有用:)

© www.soinside.com 2019 - 2024. All rights reserved.