整體流程是 markdown 轉(zhuǎn) html 在html中設(shè)置字體盯捌,最后將html轉(zhuǎn)為pdf
markdown的中文部分如何不設(shè)置字體就會出現(xiàn)亂碼的問題.
需要在轉(zhuǎn)Html后設(shè)置字體婆赠,下載字體文件 STSong.ttf 放到根目錄下
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/proto"
"github.com/yuin/goldmark"
)
func main() {
markdownContent := `
# Hello, World!
# 你好摘符,世界僵刮!
`
// 將Markdown轉(zhuǎn)換為HTML
htmlContent, err := markdownToHTML(markdownContent)
if err != nil {
log.Fatalf("Failed to convert markdown to HTML: %v", err)
}
// 在HTML中添加字體設(shè)置
htmlContent = addFontStyle(htmlContent)
// 使用go-rod/rod生成PDF
pdfContent, err := htmlToPDF(htmlContent)
if err != nil {
log.Fatalf("Failed to generate PDF: %v", err)
}
// 將PDF內(nèi)容保存到文件
if err := ioutil.WriteFile("output.pdf", pdfContent, 0644); err != nil {
log.Fatalf("Failed to save PDF to file: %v", err)
}
fmt.Println("PDF generated successfully.")
}
func addFontStyle(htmlContent string) string {
// 在HTML頭部添加字體樣式
fontStyle := `
<meta charset="UTF-8">
<style>
@font-face {
font-family: 'STSong';
src: url('STSong.ttf') format('truetype');
}
body {
font-family: 'STSong', Arial, sans-serif;
}
</style>
`
return "<!DOCTYPE html><html><head>" + fontStyle + "</head><body>" + htmlContent + "</body></html>"
}
func markdownToHTML(markdown string) (string, error) {
var buf bytes.Buffer
md := goldmark.New()
if err := md.Convert([]byte(markdown), &buf); err != nil {
return "", err
}
return buf.String(), nil
}
func htmlToPDF(htmlContent string) ([]byte, error) {
// 創(chuàng)建瀏覽器實例
fmt.Println(htmlContent)
browser := rod.New().MustConnect()
defer browser.MustClose()
// 在瀏覽器實例上創(chuàng)建新頁面
page := browser.MustPage("data:text/html," + htmlContent)
// 設(shè)置PDF生成的參數(shù)
pdfParams := proto.PagePrintToPDF{
Landscape: false,
DisplayHeaderFooter: false,
PrintBackground: true,
}
page.SetUserAgent(&proto.NetworkSetUserAgentOverride{
AcceptLanguage: "chinese",
})
// 調(diào)用Page.PDF方法生成PDF內(nèi)容
pdfReader, err := page.PDF(&pdfParams)
if err != nil {
return nil, err
}
// 讀取生成的PDF內(nèi)容
pdfContent, err := ioutil.ReadAll(pdfReader)
if err != nil {
return nil, err
}
return pdfContent, nil
}