fontforge如何一次选择多个svg字体文件

 火... [复制链接]  104查看
易西 发表于 2026-1-23 22:48:51 | 显示全部楼层 |阅读模式
本帖最后由 易西 于 2026-1-23 23:00 编辑 ; k$ b$ J7 p4 h0 i/ M

! D6 z3 F# S0 u; k, Q" K3 ]fontforge如何一次选择多个svg字体文件
: U$ _; P& {7 G  y1 z" w. ~$ y
[发帖际遇]: 易西 发帖时在路边捡到 1 金钱,偷偷放进了口袋. 幸运榜 / 衰神榜
 楼主| 易西 发表于 2026-1-23 22:49:18 | 显示全部楼层
在使用 FontForge 编辑或转换 SVG 字体文件时,你可能希望同时选择多个文件以批量处理它们。FontForge 支持多种操作来管理多个字体文件,但直接在 GUI 界面中选择多个文件进行操作稍有不同。以下是一些步骤和方法,可以帮助你选择和操作多个 SVG 字体文件:% v, E( T" V. t2 n" F: T0 ^, [! N! D

. ^! B0 N. x+ Q1 L1 T1. 使用命令行批量导入
) L; Q4 B. K7 A" x# ]# f1 n如果你熟悉命令行,可以通过命令行一次性导入多个 SVG 文件。打开终端或命令提示符,使用以下命令:
, F5 s; }' E8 k; @* [7 W7 a6 C
bash
: A$ K( j( _7 h$ k  V( m) x+ s$ s/ [" |Copy Code
4 n% h- C5 w5 X- Pfontforge -script import_svg.pe fonts/*.svg
! m% B1 P) C+ k/ _$ s) D这里,import_svg.pe 是一个 FontForge 脚本,用于导入 SVG 文件。你需要先创建一个这样的脚本,或者使用现有的脚本。fonts/*.svg 表示当前目录下所有以 .svg 结尾的文件。
2 h! J" o! }2 j! q# |6 e5 V" ^  }
; K! |1 r0 J7 v4 g2. 使用 FontForge 的菜单操作
+ Y( z0 Z5 a  }* a虽然 FontForge 的 GUI 不直接支持在文件菜单中批量选择多个文件(如直接在“文件”->“打开”中多选),但你可以通过以下方法间接实现:
; a- S( ?( Y3 R- K( A
- ~6 e+ V& W. q/ G方法一:逐一打开" a0 Y" m$ Q4 U5 n. T  k8 W3 t. @3 k
虽然这不是批量操作,但如果你只需要打开几个文件,可以逐一打开它们。每次打开后,可以通过“文件”->“附加字体”来添加更多的 SVG 文件。
3 E1 _1 A* _4 b9 T
/ w: V: j1 N! T+ B, @方法二:使用“附加字体”功能0 p* j0 A/ g- C
在 FontForge 中打开一个 SVG 文件后,你可以通过“文件”->“附加字体”来添加更多的 SVG 文件。这种方法可以让你在一个项目中同时处理多个字体文件。6 R% `: D7 P7 N1 |5 I! Q( q
6 ^7 E4 n$ E% z3 u
3. 自动化脚本
2 d5 {8 W0 O" \: o为了更高效地处理多个 SVG 文件,你可以编写一个小的自动化脚本(例如使用 Python 和 subprocess 模块),来批量打开和操作这些文件。例如:
) E1 b; M2 l( x+ _, v! z% b+ ^1 ~" o
python
/ U4 U# R1 S# j( |# Z5 E5 Z% uCopy Code9 L+ W& F! |. d8 z9 Z, R& J
import subprocess
9 K* b% _6 _. j, W8 yimport os8 F* w. P) U, c' L
; L& t9 i  ^6 }+ F' i$ j3 N
svg_files = [f for f in os.listdir('.') if f.endswith('.svg')]
, l( U/ X! G. I$ {for svg_file in svg_files:
1 W% `0 k, m0 @+ X    subprocess.call(['fontforge', '-script', 'import_svg.pe', svg_file])
# h2 d) g5 k3 s) s2 Y9 ?这个 Python 脚本会遍历当前目录下的所有 SVG 文件,并使用 FontForge 脚本逐一导入它们。! b7 v% I& i2 f9 i5 A) a) R1 n
; U- {$ C) a) U+ B
4. 使用外部工具辅助选择文件
* _7 K, P7 `% E/ }在某些情况下,你可以使用外部的文件管理器(如 Windows 的资源管理器、Mac 的 Finder 或 Linux 的 Nautilus)来选择多个文件,然后将它们拖放到 FontForge 的图标上。虽然这不是直接的 FontForge 功能,但它可以作为一种快速的方法来开始处理多个文件。
& v( A8 g: j  ]
6 R- W- c$ y9 t8 D2 K* k3 d结论0 j# G0 h0 g1 r& M
尽管 FontForge 的 GUI 不直接支持在打开文件时选择多个文件,但通过上述方法中的一种或几种组合,你可以有效地管理和操作多个 SVG 字体文件。对于更复杂的批量处理任务,使用命令行脚本或编写小的自动化脚本可能是最有效的方法。6 d6 N  q- M- ?: ?( Q

6 k. e  ~* d  Z! ?+ M参考
[发帖际遇]: 易西 被钱袋砸中进医院,看病花了 3 金钱. 幸运榜 / 衰神榜
 楼主| 易西 发表于 2026-1-23 22:54:29 | 显示全部楼层
https://www.cnblogs.com/zuoziti/p/18325149# `1 d$ x, {0 v( u" \3 S8 n
参考
 楼主| 易西 发表于 2026-1-23 22:55:41 | 显示全部楼层
https://github.com/Losketch/FontForge_Scripts_Collection
% D5 V9 y& b4 F6 R# {+ B  ~- f参考
 楼主| 易西 发表于 2026-1-23 23:01:02 | 显示全部楼层

  1. ) w5 C# e' z& J& F$ l
  2. import fontforge
    " \$ B- ?% T9 s: N# b8 _
  3. import os
    7 z% e( L, @: P6 o

  4. 2 R2 E* ]- L' j
  5. # 创建新字体5 f( V; k" r# \/ ^
  6. font = fontforge.font()  x$ h! u) n8 k( {! N, C

  7. ' b1 [9 Y* Y5 P# J
  8. # 指定SVG文件夹路径
    . m" U! Q) C/ ?' ]0 Z2 J  N
  9. svg_folder = "path/to/your/svg/files"$ v9 P  s, Q4 T, F, v: u0 L, P+ I
  10. 7 R: T2 U) Y# F, l) }6 K+ m, o$ n4 N
  11. # 遍历文件夹中的所有SVG文件
    6 \( {# j" J4 K3 e' @) G
  12. for filename in os.listdir(svg_folder):+ z$ ^& m8 ~5 K5 @( N$ B% M( y
  13.     if filename.endswith('.svg'):
    0 K( G, I1 A* d: |. f7 j
  14.         # 构建完整文件路径
    % u5 h9 _* N7 z3 E
  15.         svg_path = os.path.join(svg_folder, filename). q- J  V( O, j1 _
  16.         
    / P# Q# L  k, y1 E* h
  17.         # 获取文件名(不含扩展名)作为字形名称) Q  Z# E! V* i/ i" Q% p
  18.         glyph_name = os.path.splitext(filename)[0]% G0 H) t% b( M8 L
  19.         
    3 p: }5 g" c. P+ G# }0 w
  20.         # 创建新字形8 ?" D0 o# Y  X, ]% P+ {3 i& x
  21.         glyph = font.createChar(-1, glyph_name); Y) L! G0 `4 u% V
  22.         
    ) }! Z& D& B- g9 Z
  23.         # 从SVG导入轮廓
    ; f6 g+ F- P- s
  24.         glyph.importOutlines(svg_path)0 i  ]# Z/ D' |$ X- c* |

  25. 5 n. d! e7 E( B" U
  26. # 保存字体文件; |+ ?% ?$ R3 @2 i) t/ U
  27. font.generate("output_font.ttf")( E% w; g( e4 t# d  S% b
复制代码

, b$ b8 C! M2 N
' K( \' a1 c/ z; U- M' q, g3 a参考
 楼主| 易西 发表于 2026-1-23 23:06:43 | 显示全部楼层
  1. ( ^4 p2 I" n: Z& ?2 o
  2. import fontforge
    * y4 o. Z, C, E
  3. import os
    ; Y8 }% E) N! e

  4. ; J' Q+ u) I6 s) X
  5. # 创建新字体
    ' O3 J4 x, w, p
  6. font = fontforge.font()# {7 h! E5 Q+ R$ W8 \
  7. & L9 ?) _) a. L2 d/ w
  8. # 指定SVG文件夹路径9 s) g5 q  ^0 e% d
  9. svg_folder = "path/to/your/svg/files"
    3 x7 W1 ^* `, r+ @( |9 I0 P1 [
  10. ( Y! C9 m, Q( R& _6 [9 S! K1 V& n  ~) u& q
  11. # 获取所有SVG文件" A& \3 q% `0 _4 s  H
  12. svg_files = [f for f in os.listdir(svg_folder) if f.endswith('.svg')]& M$ B7 c) h7 f$ }/ \! T! K

  13. ( J! q2 a! ?, [0 p9 Z# |, v
  14. # 按文件名排序
    / N" L* z( t; M6 r
  15. svg_files.sort()
    % W2 ~8 z) A& |. c/ H) l

  16. 9 l- Q* V! y( |. H" t
  17. # 为每个SVG文件创建字形+ x& m/ N' d# O2 K2 ~
  18. for i, filename in enumerate(svg_files):
    2 v7 Z4 P3 X+ `- n% [/ l+ n# K
  19.     svg_path = os.path.join(svg_folder, filename)  U1 I: R* S5 J' |0 v' X
  20.    
    $ P7 Y( w- R8 n* }
  21.     # 使用文件名作为字形名称
    * e) s& [! F3 B0 J6 f+ h
  22.     glyph_name = os.path.splitext(filename)[0]" P$ T, M$ R; ]$ h
  23.     $ n" r* U% X2 i, h9 J2 a& _& s
  24.     # 创建字形(从U+1000开始的Unicode范围)$ g' J& J& `! n& s
  25.     glyph = font.createChar(0x1000 + i, glyph_name)+ Y5 }" `9 f' B! P
  26.     6 X3 ~# y, A& M4 P1 U
  27.     # 导入SVG轮廓/ R  Y: p2 n( X5 h- X
  28.     glyph.importOutlines(svg_path)8 \0 y! `& x* u, |
  29. 6 J5 _* z3 c" p+ [/ N
  30. # 保存字体文件
      v( M2 L' b5 @& t; T
  31. font.generate("output_font.ttf")4 P! g2 e  e0 X5 u
  32. print(f"成功导入 {len(svg_files)} 个SVG文件到字体")9 z( Q- N) t. f4 B9 n
  33. $ g) \6 w& E" p& p7 i# d
复制代码
' E6 y5 O: S( B+ s1 J5 \
/ g  w5 h$ e7 w+ T% x
参考
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

邮箱|首页|小黑屋|吾侪 ( 蜀ICP备2020029307号-4 )

GMT+8, 2026-8-28 15:51 , Processed in 0.066793 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © , 吾侪网

快速回复 返回顶部 返回列表