From edb8d7e8300c85960503abb1abf404d32a18a6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Z=C3=BCrcher?= Date: Wed, 24 Dec 2025 12:15:50 +0100 Subject: [PATCH] change chrome path priority close #1 --- converter/converter.go | 34 +++++++++++++++++++++++----------- html2pdf.go | 7 +++++-- html2pdf_test.go | 5 ++++- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/converter/converter.go b/converter/converter.go index 8cd57d3..672e0b1 100644 --- a/converter/converter.go +++ b/converter/converter.go @@ -2,6 +2,7 @@ package converter import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -22,9 +23,13 @@ type Converter struct { } // NewConverter starts a new converter instance with a chrome headless shell executable -func NewConverter(chromePath string) *Converter { +func NewConverter(chromePath string) (*Converter, error) { + var err error c := &Converter{chromePath: chromePath} - chromePath = c.getChromePath() + chromePath, err = c.getChromePath() + if err != nil { + return nil, err + } opts := append(chromedp.DefaultExecAllocatorOptions[:], chromedp.ExecPath(chromePath), @@ -36,7 +41,7 @@ func NewConverter(chromePath string) *Converter { var allocCtx context.Context allocCtx, c.cancel = chromedp.NewExecAllocator(context.Background(), opts...) c.ctx, c.cancel = chromedp.NewContext(allocCtx) - return c + return c, nil } // Convert converts all given input files @@ -97,10 +102,22 @@ func (c *Converter) Convert(files ...models.File) error { } // getChromePath checks for system Chrome, else falls back to bundled headless shell -func (c *Converter) getChromePath() string { +func (c *Converter) getChromePath() (string, error) { + + chromeExec := "chrome-headless-shell" + if runtime.GOOS == "windows" { + chromeExec += ".exe" + } + + path := filepath.Join(c.chromePath, chromeExec) + if _, err := os.Stat(path); err == nil { + return path, nil + } + // Candidate paths for system Chrome candidates := []string{} + // Fallback: switch runtime.GOOS { case "windows": candidates = []string{ @@ -124,14 +141,9 @@ func (c *Converter) getChromePath() string { // Check system paths first for _, path := range candidates { if _, err := os.Stat(path); err == nil { - return path + return path, nil } } - // Fallback: use bundled headless shell - chromeExec := "chrome-headless-shell" - if runtime.GOOS == "windows" { - chromeExec += ".exe" - } - return filepath.Join(c.chromePath, chromeExec) + return "", errors.New("chrome path not found") } diff --git a/html2pdf.go b/html2pdf.go index e88a099..24dc81e 100644 --- a/html2pdf.go +++ b/html2pdf.go @@ -11,11 +11,14 @@ func Convert(chromePath, inputFile, outputFile string) error { Input: inputFile, Output: outputFile, } - c := converter.NewConverter(chromePath) + c, err := converter.NewConverter(chromePath) + if err != nil { + return err + } return c.Convert(input) } // NewConverterInstance start new chrome headless shell instance -func NewConverterInstance(chromePath string) *converter.Converter { +func NewConverterInstance(chromePath string) (*converter.Converter, error) { return converter.NewConverter(chromePath) } diff --git a/html2pdf_test.go b/html2pdf_test.go index fd9aa02..3f4d751 100644 --- a/html2pdf_test.go +++ b/html2pdf_test.go @@ -41,7 +41,10 @@ func TestConvertFiles(t *testing.T) { }) } - c := converter.NewConverter("./assets") + c, err := converter.NewConverter("./assets") + if err != nil { + t.Fatal(err) + } if err := c.Convert(input...); err != nil { t.Fatal(err)