From a8a4ff2d377c982d3be0064aad1eb85296d445a0 Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Thu, 4 Dec 2025 13:20:03 +0800 Subject: [PATCH] fix --- internal/shared/pdf/font_manager.go | 99 ++++++++++++++++--- internal/shared/pdf/pdf_generator.go | 3 + .../shared/pdf/pdf_generator_refactored.go | 3 + internal/shared/pdf/resources_path.go | 57 ++++++++++- 4 files changed, 145 insertions(+), 17 deletions(-) diff --git a/internal/shared/pdf/font_manager.go b/internal/shared/pdf/font_manager.go index 08ce861..70c3ce7 100644 --- a/internal/shared/pdf/font_manager.go +++ b/internal/shared/pdf/font_manager.go @@ -76,23 +76,43 @@ func (fm *FontManager) LoadWatermarkFont(pdf *gofpdf.Fpdf) bool { func (fm *FontManager) tryAddFont(pdf *gofpdf.Fpdf, fontPath, fontName string) bool { defer func() { 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) if err != nil { + fm.logger.Warn("无法获取字体文件绝对路径", + zap.String("font_path", fontPath), + zap.Error(err), + ) absFontPath = fontPath } - // 再次检查绝对路径文件是否存在 - if _, err := os.Stat(absFontPath); err != nil { + fm.logger.Debug("尝试添加字体", + 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 } @@ -104,9 +124,19 @@ func (fm *FontManager) tryAddFont(pdf *gofpdf.Fpdf, fontPath, fontName string) b pdf.SetFont(fontName, "", 12) testWidth := pdf.GetStringWidth("测试") if testWidth == 0 { + fm.logger.Warn("字体加载后验证失败(测试文本宽度为0)", + zap.String("font_path", absFontPath), + zap.String("font_name", fontName), + ) return false } + fm.logger.Info("成功加载字体", + zap.String("font_path", absFontPath), + zap.String("font_name", fontName), + zap.Float64("test_width", testWidth), + ) + return true } @@ -136,16 +166,41 @@ func (fm *FontManager) getWatermarkFontPaths() []string { // buildFontPaths 构建字体文件路径列表(仅从resources/pdf/fonts加载) func (fm *FontManager) buildFontPaths(fontNames []string) []string { - var fontPaths []string - // 获取resources/pdf目录(使用统一的资源路径查找函数) resourcesPDFDir := GetResourcesPDFDir() 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目录加载 for _, fontName := range fontNames { - fontPath := filepath.Join(fontsDir, fontName) - fontPaths = append(fontPaths, fontPath) + fontPath := filepath.Join(absFontsDir, fontName) + // 确保每个字体路径都是绝对路径 + 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) if err == nil && fileInfo.Mode().IsRegular() { 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 } diff --git a/internal/shared/pdf/pdf_generator.go b/internal/shared/pdf/pdf_generator.go index f8623a7..0b8c1d8 100644 --- a/internal/shared/pdf/pdf_generator.go +++ b/internal/shared/pdf/pdf_generator.go @@ -28,6 +28,9 @@ type PDFGenerator struct { // NewPDFGenerator 创建PDF生成器 func NewPDFGenerator(logger *zap.Logger) *PDFGenerator { + // 设置全局logger(用于资源路径查找) + SetGlobalLogger(logger) + gen := &PDFGenerator{ logger: logger, watermarkText: "海南海宇大数据有限公司", diff --git a/internal/shared/pdf/pdf_generator_refactored.go b/internal/shared/pdf/pdf_generator_refactored.go index aaf1a2a..5f87d09 100644 --- a/internal/shared/pdf/pdf_generator_refactored.go +++ b/internal/shared/pdf/pdf_generator_refactored.go @@ -29,6 +29,9 @@ type PDFGeneratorRefactored struct { // NewPDFGeneratorRefactored 创建重构后的PDF生成器 func NewPDFGeneratorRefactored(logger *zap.Logger) *PDFGeneratorRefactored { + // 设置全局logger(用于资源路径查找) + SetGlobalLogger(logger) + // 初始化各个模块 textProcessor := NewTextProcessor() fontManager := NewFontManager(logger) diff --git a/internal/shared/pdf/resources_path.go b/internal/shared/pdf/resources_path.go index 12ed1d6..75b6e72 100644 --- a/internal/shared/pdf/resources_path.go +++ b/internal/shared/pdf/resources_path.go @@ -3,8 +3,17 @@ package pdf import ( "os" "path/filepath" + + "go.uber.org/zap" ) +var globalLogger *zap.Logger + +// SetGlobalLogger 设置全局logger(用于资源路径查找) +func SetGlobalLogger(logger *zap.Logger) { + globalLogger = logger +} + // GetResourcesPDFDir 获取resources/pdf目录路径 // resources目录和可执行文件同级,例如: // /app/tyapi-server (可执行文件) @@ -20,9 +29,22 @@ func GetResourcesPDFDir() string { // resources目录和可执行文件同级 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 globalLogger != nil { + globalLogger.Info("找到resources/pdf目录", zap.String("path", 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 { 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 globalLogger != nil { + globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath)) + } return absPath } } + // 开发环境可能在工作目录的子目录 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 globalLogger != nil { + globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath)) + } return absPath } } } - // 最后的后备:返回相对路径 + // 最后的后备:返回绝对路径(即使目录不存在) if workDir, err := os.Getwd(); err == nil { resourcesPath := filepath.Join(workDir, "resources", "pdf") if absPath, err := filepath.Abs(resourcesPath); err == nil { + if globalLogger != nil { + globalLogger.Warn("未找到resources/pdf目录,返回后备路径", zap.String("path", absPath)) + } return absPath } } + // 最后的最后:返回相对路径(不推荐) + if globalLogger != nil { + globalLogger.Error("无法确定resources/pdf目录路径") + } return filepath.Join("resources", "pdf") }