package qyglreport import ( "encoding/base64" "html/template" "mime" "os" "path/filepath" "sync" "github.com/gin-gonic/gin" ) const ( defaultBannerRel = "resources/qygl-media/banner.jpg" defaultFooterRel = "resources/qygl-media/footer.png" ) var ( loadOnce sync.Once bannerURL template.URL footerURL template.URL ) func loadPosterAssets() { bannerURL = dataURLFromFile(resolveMediaFile([]string{ defaultBannerRel, "resources/qygl-media/banner.png", }), "/reports/qygl/media/banner.jpg") footerURL = dataURLFromFile(defaultFooterRel, "/reports/qygl/media/footer.png") } func resolveMediaFile(candidates []string) string { for _, p := range candidates { if _, err := os.Stat(p); err == nil { return p } } if len(candidates) > 0 { return candidates[0] } return "" } func dataURLFromFile(path string, httpFallback string) template.URL { if path == "" { return template.URL(httpFallback) } data, err := os.ReadFile(path) if err != nil { return template.URL(httpFallback) } ext := filepath.Ext(path) mimeType := mime.TypeByExtension(ext) if mimeType == "" { switch ext { case ".jpg", ".jpeg": mimeType = "image/jpeg" case ".png": mimeType = "image/png" default: mimeType = "application/octet-stream" } } encoded := base64.StdEncoding.EncodeToString(data) return template.URL("data:" + mimeType + ";base64," + encoded) } // PageTemplateData 企业报告 HTML 模板数据(海报内嵌 data URL,PDF 生成不依赖外链) func PageTemplateData(reportJSON template.JS) gin.H { loadOnce.Do(loadPosterAssets) return gin.H{ "ReportJSON": reportJSON, "BannerPosterURL": bannerURL, "FooterPosterURL": footerURL, } }