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 (可执行文件) 和 /app/resources/pdf (资源文件) // 开发环境:工作目录下的 resources/pdf 或 tyapi-server-gin/resources/pdf func GetResourcesPDFDir() string { // 候选路径列表(按优先级排序) var candidatePaths []string // 优先级1: 从可执行文件所在目录查找(生产环境和开发环境都适用) if execPath, err := os.Executable(); err == nil { execDir := filepath.Dir(execPath) // 处理符号链接 if realPath, err := filepath.EvalSymlinks(execPath); err == nil { execDir = filepath.Dir(realPath) } candidatePaths = append(candidatePaths, filepath.Join(execDir, "resources", "pdf")) } // 优先级2: 从工作目录查找(开发环境) if workDir, err := os.Getwd(); err == nil { candidatePaths = append(candidatePaths, filepath.Join(workDir, "resources", "pdf"), filepath.Join(workDir, "tyapi-server-gin", "resources", "pdf"), ) } // 尝试每个候选路径 for _, candidatePath := range candidatePaths { absPath, err := filepath.Abs(candidatePath) if err != nil { continue } if globalLogger != nil { globalLogger.Debug("尝试查找resources/pdf目录", zap.String("path", absPath)) } // 检查目录是否存在 if info, err := os.Stat(absPath); err == nil && info.IsDir() { if globalLogger != nil { globalLogger.Info("找到resources/pdf目录", zap.String("path", absPath)) } return absPath } } // 所有候选路径都不存在,返回第一个候选路径的绝对路径(作为后备) // 这样至少保证返回的是绝对路径,即使目录不存在 if len(candidatePaths) > 0 { if absPath, err := filepath.Abs(candidatePaths[0]); err == nil { if globalLogger != nil { globalLogger.Warn("未找到resources/pdf目录,返回后备绝对路径", zap.String("path", absPath)) } return absPath } } // 最后的最后:从工作目录构建绝对路径 if workDir, err := os.Getwd(); err == nil { absPath, err := filepath.Abs(filepath.Join(workDir, "resources", "pdf")) if err == nil { if globalLogger != nil { globalLogger.Error("无法确定resources/pdf目录,返回工作目录下的绝对路径", zap.String("path", absPath)) } return absPath } } // 完全无法确定路径 if globalLogger != nil { globalLogger.Error("完全无法确定resources/pdf目录路径") } return "" }