1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
package main
import (
"bufio"
"bytes"
"context"
"fmt"
"html/template"
"net/http"
"net/http/httptest"
"os"
"github.com/chromedp/cdproto/page"
"github.com/chromedp/chromedp"
"github.com/gin-gonic/gin"
"github.com/pkg/errors"
)
type Content struct {
ChannelLogo template.URL
ProductLogo template.URL
Title string
Content string
UserName string
OrgName string
ChannelName string
Number string
Date string
BackgroundImage template.URL
}
func writeHTML(content Content) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html")
var (
wd string
err error
tmpl *template.Template
)
wd, _ = os.Getwd()
tmpl, err = template.ParseFiles(wd + "/tmp.html")
if err != nil {
err = errors.Wrapf(err, "template.ParseFiles err")
_, _ = w.Write([]byte(err.Error()))
return
}
buffer := &bytes.Buffer{}
err = tmpl.Execute(buffer, content)
if err != nil {
err = errors.Wrapf(err, "tmpl.Execute err")
_, _ = w.Write([]byte(err.Error()))
return
}
_, _ = w.Write(buffer.Bytes())
})
}
func dp(c *gin.Context) {
var (
err error
buf = make([]byte, 0)
)
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
mux := http.NewServeMux()
mux.Handle("/pre", writeHTML(Content{
ChannelLogo: "",
ProductLogo: "",
Title: "我是title",
Content: "我是内容",
UserName: "1111",
OrgName: "2222",
ChannelName: "3333",
Number: "4444",
Date: "2006-01-02 15:04:05",
BackgroundImage: "",
}))
ts := httptest.NewServer(mux)
defer ts.Close()
url := fmt.Sprintf("%s/pre", ts.URL)
err = chromedp.Run(ctx, chromedp.Tasks{
chromedp.Navigate(url),
chromedp.WaitReady("body"),
chromedp.ActionFunc(func(ctx context.Context) error {
var err error
buf, _, err = page.PrintToPDF().
WithPrintBackground(true).
WithPageRanges("1").
Do(ctx)
return err
}),
})
if err != nil {
err = errors.Wrapf(err, "chromedp Run failed")
c.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
})
return
}
buffer := &bytes.Buffer{}
buffer.WriteString("\xEF\xBB\xBF") // 防止中文乱码
writer := bufio.NewWriter(buffer)
_, err = writer.Write(buf)
if err != nil {
err = errors.Wrapf(err, "bufio Write err")
c.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
})
return
}
_ = writer.Flush()
fileName := fmt.Sprintf("1111.pdf")
c.Header("Content-Type", "text/pdf")
c.Header("Content-Disposition", "attachment;filename="+fileName)
_, _ = c.Writer.Write(buffer.Bytes())
return
}
func main() {
route := gin.New()
route.GET("/dp", dp)
route.Run(":8080")
}
|