괴발개발 성장기

Study/Go 언어

[golang] Html 파일을 PDF로 변환 (go-wkhtmltopdf 사용)

지니유 2021. 12. 8. 22:47
반응형

엄청난 뻘짓을 했다. 정보를 찾아 찾아 코드를 짰는데...

 

wkhtmltopdf not found 에러가 계속 났다. exe 파일 필요한 것 같은데...
모듈 말고 다른걸 설치해야한다는 생각을 못했다.

 

1) https://wkhtmltopdf.org/downloads.html 에 가서 OS에 따라 다운 받기

 

wkhtmltopdf

All downloads are currently hosted via GitHub releases, so you can browse for a specific download or use the links below. Do not use wkhtmltopdf with any untrusted HTML – be sure to sanitize any user-supplied HTML/JS, otherwise it can lead to complete ta

wkhtmltopdf.org

참조: 여기에서는 맥이 다운 받아지지 않았다

brew install Caskroom/cask/wkhtmltopdf

이걸로 다운을 받았다.

 

2) terminal에 모듈 설치

go get -u github.com/SebastiaanKlippert/go-wkhtmltopdf

 

3) 환경변수 설정

이름: WKHTMLTOPDF_PATH 값: C:\Program Files\wkhtmltopdf\bin (설치된 장소)

 

4) 코드를 작성한다. 나는 처음에 API 호출할 때마다 변환하는 걸로 하려고 했는데 샘플 자료는 메인에 만들었다.

# main.go

func main()  {

	dataHTML := common.Data{
		Name: "YooGenie",
		Address: "서울",
		Mobile: "000-0000-0000",
	}

	fileHtmlName, err := html.HtmlTemplate("template/test.html", dataHTML)
	if err != nil{
		fmt.Println(err)
		return
	}

	fmt.Println("HTML : ", fileHtmlName)

	defer os.Remove(fileHtmlName)
	filePDFName, err := pdf.HtmlToPdf(fileHtmlName)

	if err != nil{
		fmt.Println(err)
		return
	}
	fmt.Println("PDF : ", filePDFName)
	return
}

# html.go (템플릿에 값을 넣는 것)

func HtmlTemplate(filePath string, data interface{}) (string, error) {
	root := common.HtmlStruct{RootPath: "file"}
	
	t, err := template.ParseFiles(filePath)
	if err != nil {
		return "", err
	}

	fileName := root.RootPath + "/genie.html"

	fileWriter, err := os.Create(fileName)
	if err != nil {
		return "", err
	}

	if err := t.Execute(fileWriter, data); err != nil {
		return "", err
	}

	return fileName, nil
}

# pdf.go (html를 pdf로 변환)


func HtmlToPdf(htmlFile string) (string, error) {
	root := common.HtmlStruct{RootPath: "file"}

	f, err := os.Open(htmlFile)
	if err != nil {
		return "", err
	}

	pdfg, err := wkhtmltopdf.NewPDFGenerator()
	if err != nil {
		return "", err
	}

	pdfg.AddPage(wkhtmltopdf.NewPageReader(f))

	if err := pdfg.Create(); err != nil {
		return "", err
	}

	fileName :=  root.RootPath + "/genie.pdf"

	if err := pdfg.WriteFile(fileName); err != nil {
		return "", err
	}

	return fileName, nil
}

 

자세한 내용은 GitHub gogo

https://github.com/YooGenie/htmlToPdf

 

# 참조

https://github.com/SebastiaanKlippert/go-wkhtmltopdf

반응형