pdf_windows.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package utils
  2. import (
  3. "os/exec"
  4. "bufio"
  5. "io"
  6. "io/ioutil"
  7. "errors"
  8. "github.com/axgle/mahonia"
  9. "github.com/astaxie/beego"
  10. )
  11. // 使用 wkhtmltopdf 是实现 html 转 pdf.
  12. // 中文说明:http://www.jianshu.com/p/4d65857ffe5e#
  13. func ConverterHtmlToPdf(uri []string,path string) (error) {
  14. exe := beego.AppConfig.String("wkhtmltopdf")
  15. if exe == "" {
  16. return errors.New("wkhtmltopdf not exist.")
  17. }
  18. params := []string{"/C",exe,"--margin-bottom","25"}
  19. params = append(params,uri...)
  20. params = append(params,path)
  21. cmd := exec.Command("cmd",params...)
  22. stdout, err := cmd.StdoutPipe()
  23. if err != nil {
  24. return errors.New("StdoutPipe: " + err.Error())
  25. }
  26. stderr, err := cmd.StderrPipe()
  27. if err != nil {
  28. return errors.New("StderrPipe: " + err.Error())
  29. }
  30. if err := cmd.Start(); err != nil {
  31. return errors.New("Start: "+ err.Error())
  32. }
  33. reader := bufio.NewReader(stdout)
  34. enc := mahonia.NewDecoder("gbk")
  35. //实时循环读取输出流中的一行内容
  36. for {
  37. line ,err2 := reader.ReadString('\n')
  38. if err2 != nil || io.EOF == err2 {
  39. break
  40. }
  41. beego.Info(enc.ConvertString(line))
  42. }
  43. bytesErr, err := ioutil.ReadAll(stderr)
  44. if err == nil {
  45. beego.Info(enc.ConvertString(string(bytesErr)))
  46. }else{
  47. beego.Error("Error: Stderr => " + err.Error())
  48. return err
  49. }
  50. if err := cmd.Wait(); err != nil {
  51. beego.Error("Error: ", err.Error())
  52. return err
  53. }
  54. return nil
  55. }