pdf_linux.go 1.3 KB

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