fix
This commit is contained in:
@@ -76,23 +76,43 @@ func (fm *FontManager) LoadWatermarkFont(pdf *gofpdf.Fpdf) bool {
|
|||||||
func (fm *FontManager) tryAddFont(pdf *gofpdf.Fpdf, fontPath, fontName string) bool {
|
func (fm *FontManager) tryAddFont(pdf *gofpdf.Fpdf, fontPath, fontName string) bool {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
// 静默处理,不记录日志
|
fm.logger.Error("添加字体时发生panic",
|
||||||
|
zap.String("font_path", fontPath),
|
||||||
|
zap.String("font_name", fontName),
|
||||||
|
zap.Any("panic_value", r),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// 检查文件是否存在
|
// 确保路径是绝对路径
|
||||||
if _, err := os.Stat(fontPath); err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将相对路径转换为绝对路径(gofpdf在Output时需要绝对路径)
|
|
||||||
absFontPath, err := filepath.Abs(fontPath)
|
absFontPath, err := filepath.Abs(fontPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fm.logger.Warn("无法获取字体文件绝对路径",
|
||||||
|
zap.String("font_path", fontPath),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
absFontPath = fontPath
|
absFontPath = fontPath
|
||||||
}
|
}
|
||||||
|
|
||||||
// 再次检查绝对路径文件是否存在
|
fm.logger.Debug("尝试添加字体",
|
||||||
if _, err := os.Stat(absFontPath); err != nil {
|
zap.String("font_path", absFontPath),
|
||||||
|
zap.String("font_name", fontName),
|
||||||
|
)
|
||||||
|
|
||||||
|
// 检查文件是否存在
|
||||||
|
fileInfo, err := os.Stat(absFontPath)
|
||||||
|
if err != nil {
|
||||||
|
fm.logger.Debug("字体文件不存在",
|
||||||
|
zap.String("font_path", absFontPath),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fileInfo.Mode().IsRegular() {
|
||||||
|
fm.logger.Warn("字体路径不是普通文件",
|
||||||
|
zap.String("font_path", absFontPath),
|
||||||
|
)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,9 +124,19 @@ func (fm *FontManager) tryAddFont(pdf *gofpdf.Fpdf, fontPath, fontName string) b
|
|||||||
pdf.SetFont(fontName, "", 12)
|
pdf.SetFont(fontName, "", 12)
|
||||||
testWidth := pdf.GetStringWidth("测试")
|
testWidth := pdf.GetStringWidth("测试")
|
||||||
if testWidth == 0 {
|
if testWidth == 0 {
|
||||||
|
fm.logger.Warn("字体加载后验证失败(测试文本宽度为0)",
|
||||||
|
zap.String("font_path", absFontPath),
|
||||||
|
zap.String("font_name", fontName),
|
||||||
|
)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fm.logger.Info("成功加载字体",
|
||||||
|
zap.String("font_path", absFontPath),
|
||||||
|
zap.String("font_name", fontName),
|
||||||
|
zap.Float64("test_width", testWidth),
|
||||||
|
)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,16 +166,41 @@ func (fm *FontManager) getWatermarkFontPaths() []string {
|
|||||||
|
|
||||||
// buildFontPaths 构建字体文件路径列表(仅从resources/pdf/fonts加载)
|
// buildFontPaths 构建字体文件路径列表(仅从resources/pdf/fonts加载)
|
||||||
func (fm *FontManager) buildFontPaths(fontNames []string) []string {
|
func (fm *FontManager) buildFontPaths(fontNames []string) []string {
|
||||||
var fontPaths []string
|
|
||||||
|
|
||||||
// 获取resources/pdf目录(使用统一的资源路径查找函数)
|
// 获取resources/pdf目录(使用统一的资源路径查找函数)
|
||||||
resourcesPDFDir := GetResourcesPDFDir()
|
resourcesPDFDir := GetResourcesPDFDir()
|
||||||
fontsDir := filepath.Join(resourcesPDFDir, "fonts")
|
fontsDir := filepath.Join(resourcesPDFDir, "fonts")
|
||||||
|
|
||||||
|
// 确保fontsDir是绝对路径
|
||||||
|
absFontsDir, err := filepath.Abs(fontsDir)
|
||||||
|
if err != nil {
|
||||||
|
fm.logger.Warn("无法获取字体目录绝对路径",
|
||||||
|
zap.String("fonts_dir", fontsDir),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
absFontsDir = fontsDir
|
||||||
|
}
|
||||||
|
|
||||||
|
fm.logger.Debug("查找字体文件",
|
||||||
|
zap.String("resources_pdf_dir", resourcesPDFDir),
|
||||||
|
zap.String("fonts_dir", absFontsDir),
|
||||||
|
zap.Strings("font_names", fontNames),
|
||||||
|
)
|
||||||
|
|
||||||
|
var fontPaths []string
|
||||||
|
|
||||||
// 只从resources/pdf/fonts目录加载
|
// 只从resources/pdf/fonts目录加载
|
||||||
for _, fontName := range fontNames {
|
for _, fontName := range fontNames {
|
||||||
fontPath := filepath.Join(fontsDir, fontName)
|
fontPath := filepath.Join(absFontsDir, fontName)
|
||||||
fontPaths = append(fontPaths, fontPath)
|
// 确保每个字体路径都是绝对路径
|
||||||
|
absFontPath, err := filepath.Abs(fontPath)
|
||||||
|
if err != nil {
|
||||||
|
fm.logger.Debug("无法获取字体文件绝对路径",
|
||||||
|
zap.String("font_path", fontPath),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
absFontPath = fontPath
|
||||||
|
}
|
||||||
|
fontPaths = append(fontPaths, absFontPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 过滤出实际存在的字体文件
|
// 过滤出实际存在的字体文件
|
||||||
@@ -154,9 +209,27 @@ func (fm *FontManager) buildFontPaths(fontNames []string) []string {
|
|||||||
fileInfo, err := os.Stat(fontPath)
|
fileInfo, err := os.Stat(fontPath)
|
||||||
if err == nil && fileInfo.Mode().IsRegular() {
|
if err == nil && fileInfo.Mode().IsRegular() {
|
||||||
existingFonts = append(existingFonts, fontPath)
|
existingFonts = append(existingFonts, fontPath)
|
||||||
|
fm.logger.Debug("找到字体文件", zap.String("font_path", fontPath))
|
||||||
|
} else {
|
||||||
|
fm.logger.Debug("字体文件不存在",
|
||||||
|
zap.String("font_path", fontPath),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(existingFonts) == 0 {
|
||||||
|
fm.logger.Warn("未找到任何字体文件",
|
||||||
|
zap.String("fonts_dir", absFontsDir),
|
||||||
|
zap.Strings("attempted_fonts", fontPaths),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
fm.logger.Info("找到字体文件",
|
||||||
|
zap.Int("count", len(existingFonts)),
|
||||||
|
zap.Strings("font_paths", existingFonts),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
return existingFonts
|
return existingFonts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ type PDFGenerator struct {
|
|||||||
|
|
||||||
// NewPDFGenerator 创建PDF生成器
|
// NewPDFGenerator 创建PDF生成器
|
||||||
func NewPDFGenerator(logger *zap.Logger) *PDFGenerator {
|
func NewPDFGenerator(logger *zap.Logger) *PDFGenerator {
|
||||||
|
// 设置全局logger(用于资源路径查找)
|
||||||
|
SetGlobalLogger(logger)
|
||||||
|
|
||||||
gen := &PDFGenerator{
|
gen := &PDFGenerator{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
watermarkText: "海南海宇大数据有限公司",
|
watermarkText: "海南海宇大数据有限公司",
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ type PDFGeneratorRefactored struct {
|
|||||||
|
|
||||||
// NewPDFGeneratorRefactored 创建重构后的PDF生成器
|
// NewPDFGeneratorRefactored 创建重构后的PDF生成器
|
||||||
func NewPDFGeneratorRefactored(logger *zap.Logger) *PDFGeneratorRefactored {
|
func NewPDFGeneratorRefactored(logger *zap.Logger) *PDFGeneratorRefactored {
|
||||||
|
// 设置全局logger(用于资源路径查找)
|
||||||
|
SetGlobalLogger(logger)
|
||||||
|
|
||||||
// 初始化各个模块
|
// 初始化各个模块
|
||||||
textProcessor := NewTextProcessor()
|
textProcessor := NewTextProcessor()
|
||||||
fontManager := NewFontManager(logger)
|
fontManager := NewFontManager(logger)
|
||||||
|
|||||||
@@ -3,8 +3,17 @@ package pdf
|
|||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var globalLogger *zap.Logger
|
||||||
|
|
||||||
|
// SetGlobalLogger 设置全局logger(用于资源路径查找)
|
||||||
|
func SetGlobalLogger(logger *zap.Logger) {
|
||||||
|
globalLogger = logger
|
||||||
|
}
|
||||||
|
|
||||||
// GetResourcesPDFDir 获取resources/pdf目录路径
|
// GetResourcesPDFDir 获取resources/pdf目录路径
|
||||||
// resources目录和可执行文件同级,例如:
|
// resources目录和可执行文件同级,例如:
|
||||||
// /app/tyapi-server (可执行文件)
|
// /app/tyapi-server (可执行文件)
|
||||||
@@ -20,9 +29,22 @@ func GetResourcesPDFDir() string {
|
|||||||
|
|
||||||
// resources目录和可执行文件同级
|
// resources目录和可执行文件同级
|
||||||
resourcesPath := filepath.Join(execDir, "resources", "pdf")
|
resourcesPath := filepath.Join(execDir, "resources", "pdf")
|
||||||
if absPath, err := filepath.Abs(resourcesPath); err == nil {
|
absPath, err := filepath.Abs(resourcesPath)
|
||||||
|
if err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Debug("尝试从可执行文件目录查找资源",
|
||||||
|
zap.String("exec_path", execPath),
|
||||||
|
zap.String("exec_dir", execDir),
|
||||||
|
zap.String("resources_path", absPath),
|
||||||
|
)
|
||||||
|
}
|
||||||
if _, err := os.Stat(absPath); err == nil {
|
if _, err := os.Stat(absPath); err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath))
|
||||||
|
}
|
||||||
return absPath
|
return absPath
|
||||||
|
} else if globalLogger != nil {
|
||||||
|
globalLogger.Debug("资源目录不存在", zap.String("path", absPath), zap.Error(err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,28 +52,55 @@ func GetResourcesPDFDir() string {
|
|||||||
// 后备方案:从工作目录查找(开发环境)
|
// 后备方案:从工作目录查找(开发环境)
|
||||||
if workDir, err := os.Getwd(); err == nil {
|
if workDir, err := os.Getwd(); err == nil {
|
||||||
resourcesPath := filepath.Join(workDir, "resources", "pdf")
|
resourcesPath := filepath.Join(workDir, "resources", "pdf")
|
||||||
if absPath, err := filepath.Abs(resourcesPath); err == nil {
|
absPath, err := filepath.Abs(resourcesPath)
|
||||||
|
if err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Debug("尝试从工作目录查找资源",
|
||||||
|
zap.String("work_dir", workDir),
|
||||||
|
zap.String("resources_path", absPath),
|
||||||
|
)
|
||||||
|
}
|
||||||
if _, err := os.Stat(absPath); err == nil {
|
if _, err := os.Stat(absPath); err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath))
|
||||||
|
}
|
||||||
return absPath
|
return absPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 开发环境可能在工作目录的子目录
|
// 开发环境可能在工作目录的子目录
|
||||||
resourcesPath = filepath.Join(workDir, "tyapi-server-gin", "resources", "pdf")
|
resourcesPath = filepath.Join(workDir, "tyapi-server-gin", "resources", "pdf")
|
||||||
if absPath, err := filepath.Abs(resourcesPath); err == nil {
|
absPath, err = filepath.Abs(resourcesPath)
|
||||||
|
if err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Debug("尝试从工作目录子目录查找资源",
|
||||||
|
zap.String("resources_path", absPath),
|
||||||
|
)
|
||||||
|
}
|
||||||
if _, err := os.Stat(absPath); err == nil {
|
if _, err := os.Stat(absPath); err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath))
|
||||||
|
}
|
||||||
return absPath
|
return absPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 最后的后备:返回相对路径
|
// 最后的后备:返回绝对路径(即使目录不存在)
|
||||||
if workDir, err := os.Getwd(); err == nil {
|
if workDir, err := os.Getwd(); err == nil {
|
||||||
resourcesPath := filepath.Join(workDir, "resources", "pdf")
|
resourcesPath := filepath.Join(workDir, "resources", "pdf")
|
||||||
if absPath, err := filepath.Abs(resourcesPath); err == nil {
|
if absPath, err := filepath.Abs(resourcesPath); err == nil {
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Warn("未找到resources/pdf目录,返回后备路径", zap.String("path", absPath))
|
||||||
|
}
|
||||||
return absPath
|
return absPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 最后的最后:返回相对路径(不推荐)
|
||||||
|
if globalLogger != nil {
|
||||||
|
globalLogger.Error("无法确定resources/pdf目录路径")
|
||||||
|
}
|
||||||
return filepath.Join("resources", "pdf")
|
return filepath.Join("resources", "pdf")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user