pdf_windows.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. beego.Info(params)
  22. cmd := exec.Command("cmd",params...)
  23. stdout, err := cmd.StdoutPipe()
  24. if err != nil {
  25. return errors.New("StdoutPipe: " + err.Error())
  26. }
  27. stderr, err := cmd.StderrPipe()
  28. if err != nil {
  29. return errors.New("StderrPipe: " + err.Error())
  30. }
  31. if err := cmd.Start(); err != nil {
  32. return errors.New("Start: "+ err.Error())
  33. }
  34. reader := bufio.NewReader(stdout)
  35. enc := mahonia.NewDecoder("gbk")
  36. //实时循环读取输出流中的一行内容
  37. for {
  38. line ,err2 := reader.ReadString('\n')
  39. if err2 != nil || io.EOF == err2 {
  40. break
  41. }
  42. beego.Info(enc.ConvertString(line))
  43. }
  44. bytesErr, err := ioutil.ReadAll(stderr)
  45. if err == nil {
  46. beego.Info(enc.ConvertString(string(bytesErr)))
  47. }else{
  48. beego.Error("Error: Stderr => " + err.Error())
  49. return err
  50. }
  51. if err := cmd.Wait(); err != nil {
  52. beego.Error("Error: ", err.Error())
  53. return err
  54. }
  55. return nil
  56. }