From 382a799038017697630eb28a189bf1da8f3b2f70 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 3 Dec 2024 16:25:17 +0100 Subject: [PATCH] feat(services): Implement pdf conversion through gotenberg --- services/converter.go | 107 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 services/converter.go diff --git a/services/converter.go b/services/converter.go new file mode 100644 index 0000000..dd56eda --- /dev/null +++ b/services/converter.go @@ -0,0 +1,107 @@ +package services + +import ( + "bytes" + "fmt" + "mime/multipart" + "net/http" + "strconv" + + "github.com/oxplot/papersizes" +) + +type Converter interface { + ToPdf(html string, pageSize string, landscape bool) ([]byte, error) +} + +type GotenbergConverter struct { + BaseUrl string +} + +func (g *GotenbergConverter) ToPdf(html string, pageSize string, landscape bool) ([]byte, error) { + client := &http.Client{} + defer client.CloseIdleConnections() + + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + + part, err := writer.CreateFormFile("files", "index.html") + if err != nil { + return nil, err + } + + _, err = part.Write([]byte(html)) + if err != nil { + return nil, err + } + + size := papersizes.FromName(pageSize) + if size == nil { + return nil, fmt.Errorf("invalid page size: %s", pageSize) + } + + err = writer.WriteField("paperWidth", strconv.Itoa(size.Width)+"mm") + if err != nil { + return nil, err + } + + err = writer.WriteField("paperHeight", strconv.Itoa(size.Height)+"mm") + if err != nil { + return nil, err + } + + err = writer.WriteField("landscape", strconv.FormatBool(landscape)) + if err != nil { + return nil, err + } + + err = writer.WriteField("marginTop", "0") + if err != nil { + return nil, err + } + + err = writer.WriteField("marginBottom", "0") + if err != nil { + return nil, err + } + + err = writer.WriteField("marginLeft", "0") + if err != nil { + return nil, err + } + + err = writer.WriteField("marginRight", "0") + if err != nil { + return nil, err + } + + err = writer.WriteField("preferCssPageSize", "true") + if err != nil { + return nil, err + } + + err = writer.Close() + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", g.BaseUrl+"/forms/chromium/convert/html", body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", writer.FormDataContentType()) + + resp, err := client.Do(req) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + data := new(bytes.Buffer) + _, err = data.ReadFrom(resp.Body) + if err != nil { + return nil, err + } + + return data.Bytes(), nil +}