|
@@ -1,12 +1,15 @@
|
|
package renderer
|
|
package renderer
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "bufio"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
"fmt"
|
|
"fmt"
|
|
"html/template"
|
|
"html/template"
|
|
|
|
+ "io"
|
|
"mime"
|
|
"mime"
|
|
"net/http"
|
|
"net/http"
|
|
"net/url"
|
|
"net/url"
|
|
|
|
+ "os"
|
|
"path"
|
|
"path"
|
|
"path/filepath"
|
|
"path/filepath"
|
|
"reflect"
|
|
"reflect"
|
|
@@ -23,6 +26,7 @@ type Renderer interface {
|
|
|
|
|
|
type JSONRenderer struct{}
|
|
type JSONRenderer struct{}
|
|
type CSVRenderer struct{}
|
|
type CSVRenderer struct{}
|
|
|
|
+type PDFRenderer struct{}
|
|
|
|
|
|
type htmlTemplateData struct {
|
|
type htmlTemplateData struct {
|
|
Data interface{}
|
|
Data interface{}
|
|
@@ -47,6 +51,7 @@ var (
|
|
"application/x-www-form-urlencoded": "html",
|
|
"application/x-www-form-urlencoded": "html",
|
|
"application/json": "json",
|
|
"application/json": "json",
|
|
"text/csv; charset=utf-8": "csv",
|
|
"text/csv; charset=utf-8": "csv",
|
|
|
|
+ "application/pdf": "pdf",
|
|
}
|
|
}
|
|
)
|
|
)
|
|
|
|
|
|
@@ -66,6 +71,11 @@ func init() {
|
|
panic(err)
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ pdfRenderer, err := NewPDFRenderer()
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+
|
|
Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
|
|
Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
|
|
|
|
|
|
Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
|
|
Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
|
|
@@ -80,6 +90,10 @@ func init() {
|
|
csvRenderer.Render(w, r, data, options...)
|
|
csvRenderer.Render(w, r, data, options...)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ Render["pdf"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
|
|
|
|
+ pdfRenderer.Render(w, r, data, options...)
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
func Query(values ...string) template.URL {
|
|
func Query(values ...string) template.URL {
|
|
@@ -164,6 +178,23 @@ func (rend *CSVRenderer) Render(w http.ResponseWriter, r *http.Request, data int
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func NewPDFRenderer() (*PDFRenderer, error) {
|
|
|
|
+ return &PDFRenderer{}, nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (rend *PDFRenderer) Render(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) error {
|
|
|
|
+ w.Header().Set("Content-Type", "application/pdf")
|
|
|
|
+ fileMap := data.(map[string]string)
|
|
|
|
+ f, err := os.Open(filepath.Join("output", fileMap["document_id"], fileMap["id"], fileMap["filename"]))
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+ reader := bufio.NewReader(f)
|
|
|
|
+ io.Copy(w, reader)
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
type HTMLRenderer struct {
|
|
type HTMLRenderer struct {
|
|
TemplatePath string
|
|
TemplatePath string
|
|
|
|
|