Untitled

 avatar
unknown
plain_text
a year ago
3.2 kB
4
Indexable
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from fontTools.ttLib import TTFont
from fontTools import subset, merge

def subset_font(font_file, whitelist, subset_output):
    # 加载字体
    font = TTFont(font_file)

    # 创建 Subsetter 对象并填充白名单字符
    options = subset.Options()
    subsetter = subset.Subsetter(options=options)
    subsetter.populate(text=whitelist)
    subsetter.subset(font)

    # 保存子集字体
    font.save(subset_output)
    print(f"Subset font saved to {subset_output}")

def merge_fonts(font_file1, font_file2, output_file):
    font1 = TTFont(font_file1)
    font2 = TTFont(font_file2)

    # 获取两个字体的 Unicode 映射
    us1 = {}
    for cmap in font1['cmap'].tables:
        if cmap.isUnicode():
            us1.update(cmap.cmap)

    us2 = {}
    for cmap in font2['cmap'].tables:
        if cmap.isUnicode():
            us2.update(cmap.cmap)

    # 找到只存在于第一个字体的字形
    unique_to_font1 = [us1[code] for code in us1 if code not in us2]

    # 创建 Subsetter 对象并填充 unique_to_font1
    options = subset.Options()
    subsetter = subset.Subsetter(options)
    subsetter.populate(glyphs=unique_to_font1)
    subsetter.subset(font1)
    temp_subset = "temp_subset.ttf"
    subset.save_font(font1, temp_subset, options)

    # 合并字体
    m = merge.Merger()
    merged_font = m.merge([font_file2, temp_subset])
    merged_font.save(output_file)
    print(f"Merged font saved to {output_file}")

    # 删除临时文件
    os.remove(temp_subset)

def browse_file(var):
    file = filedialog.askopenfilename(filetypes=[("TTF files", "*.ttf")])
    var.set(file)

def run():
    whitelist = whitelist_text.get("1.0", tk.END).strip()
    font_file1 = font1_var.get()
    font_file2 = font2_var.get()
    output_file = "merged_output.ttf"
    
    if not whitelist or not font_file1 or not font_file2:
        messagebox.showwarning("Missing Input", "Please provide all inputs.")
        return

    try:
        subset_output = "subset.ttf"
        subset_font(font_file1, whitelist, subset_output)
        merge_fonts(font_file2, subset_output, output_file)
        os.remove(subset_output)
        messagebox.showinfo("Success", f"Merged font saved to {output_file}")
    except Exception as e:
        messagebox.showerror("Error", str(e))

app = tk.Tk()
app.title("Font Merger")

tk.Label(app, text="填入希望字体1中包含的字符(白名单)").pack()
whitelist_text = tk.Text(app, height=5)
whitelist_text.pack()

font1_var = tk.StringVar()
font2_var = tk.StringVar()

tk.Label(app, text="选择字体1路径").pack()
tk.Entry(app, textvariable=font1_var, width=50).pack()
tk.Button(app, text="浏览文件", command=lambda: browse_file(font1_var)).pack()

tk.Label(app, text="选择字体2路径").pack()
tk.Entry(app, textvariable=font2_var, width=50).pack()
tk.Button(app, text="浏览文件", command=lambda: browse_file(font2_var)).pack()

tk.Button(app, text="合并字体", command=run).pack()

app.mainloop()
Editor is loading...
Leave a Comment