This commit is contained in:
Mrx
2026-03-16 12:32:41 +08:00
parent 09db8d003e
commit 14b2c53eeb
5 changed files with 394 additions and 75 deletions

View File

@@ -16,6 +16,8 @@ type FontManager struct {
chineseFontLoaded bool
watermarkFontName string
watermarkFontLoaded bool
bodyFontName string
bodyFontLoaded bool
}
// NewFontManager 创建字体管理器
@@ -24,6 +26,7 @@ func NewFontManager(logger *zap.Logger) *FontManager {
logger: logger,
chineseFontName: "ChineseFont",
watermarkFontName: "WatermarkFont",
bodyFontName: "BodyFont",
}
}
@@ -73,6 +76,21 @@ func (fm *FontManager) LoadWatermarkFont(pdf *gofpdf.Fpdf) bool {
return false
}
// LoadBodyFont 加载正文用宋体(用于描述、详情、说明、表格文字等)
func (fm *FontManager) LoadBodyFont(pdf *gofpdf.Fpdf) bool {
if fm.bodyFontLoaded {
return true
}
fontPaths := fm.getBodyFontPaths()
for _, fontPath := range fontPaths {
if fm.tryAddFont(pdf, fontPath, fm.bodyFontName) {
fm.bodyFontLoaded = true
return true
}
}
return false
}
// tryAddFont 尝试添加字体(统一处理中文字体和水印字体)
func (fm *FontManager) tryAddFont(pdf *gofpdf.Fpdf, fontPath, fontName string) bool {
defer func() {
@@ -214,6 +232,18 @@ func (fm *FontManager) getWatermarkFontPaths() []string {
return fm.buildFontPaths(fontNames)
}
// getBodyFontPaths 获取正文宋体路径列表(小四对应 12pt
// 优先使用 resources/pdf/fonts/simsun.ttc宋体
func (fm *FontManager) getBodyFontPaths() []string {
fontNames := []string{
// "simsun.ttc", // 宋体(项目内 resources/pdf/fonts
"simsun.ttf",
"SimSun.ttf",
"WenYuanSerifSC-Bold.ttf", // 文渊宋体风格,备选
}
return fm.buildFontPaths(fontNames)
}
// buildFontPaths 构建字体文件路径列表仅从resources/pdf/fonts加载
// 返回所有存在的字体文件的绝对路径
func (fm *FontManager) buildFontPaths(fontNames []string) []string {
@@ -297,6 +327,28 @@ func (fm *FontManager) SetWatermarkFont(pdf *gofpdf.Fpdf, style string, size flo
}
}
// BodyFontSizeXiaosi 正文小四字号(约 12pt
const BodyFontSizeXiaosi = 12.0
// SetBodyFont 设置正文字体(宋体小四:描述、详情、说明、表格文字等)
func (fm *FontManager) SetBodyFont(pdf *gofpdf.Fpdf, style string, size float64) {
if size <= 0 {
size = BodyFontSizeXiaosi
}
if fm.bodyFontLoaded {
pdf.SetFont(fm.bodyFontName, style, size)
} else if fm.watermarkFontLoaded {
pdf.SetFont(fm.watermarkFontName, style, size)
} else {
fm.SetFont(pdf, style, size)
}
}
// IsBodyFontAvailable 正文字体(宋体)是否已加载
func (fm *FontManager) IsBodyFontAvailable() bool {
return fm.bodyFontLoaded || fm.watermarkFontLoaded
}
// IsChineseFontAvailable 检查中文字体是否可用
func (fm *FontManager) IsChineseFontAvailable() bool {
return fm.chineseFontLoaded