From f7fe35e43ab8f16d1a2bcf7eaae5c6d8b93c1c22 Mon Sep 17 00:00:00 2001 From: Minho Date: Tue, 9 May 2017 10:04:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0Linux=E4=B8=8B=E5=AF=BC?= =?UTF-8?q?=E5=87=BApdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/document.go | 6 ++-- utils/pdf_linux.go | 75 +++++++++++++++++++++++++++++++++++++++++ utils/pdf_windows.go | 32 +++++++++--------- 3 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 utils/pdf_linux.go diff --git a/controllers/document.go b/controllers/document.go index 9a1aded2..79095415 100644 --- a/controllers/document.go +++ b/controllers/document.go @@ -566,9 +566,9 @@ func (c *DocumentController) Export() { c.TplName = "document/export.tpl" identify := c.Ctx.Input.Param(":key") - // token := c.GetString("token") + output := c.GetString("output") - //id, _ := c.GetInt(":id") + token := c.GetString("token") if identify == "" { @@ -629,7 +629,7 @@ func (c *DocumentController) Export() { c.StopRun() } - +//递归生成文档序列数组. func RecursiveFun(parent_id int,prefix,dpath string,c *DocumentController,book *models.BookResult,docs []*models.Document,paths *list.List) { for _, item := range docs { if item.ParentId == parent_id { diff --git a/utils/pdf_linux.go b/utils/pdf_linux.go new file mode 100644 index 00000000..00228b6a --- /dev/null +++ b/utils/pdf_linux.go @@ -0,0 +1,75 @@ +package utils + +import ( + "os/exec" + "bufio" + "io" + "io/ioutil" + "errors" + + "github.com/astaxie/beego" +) + + +// 使用 wkhtmltopdf 是实现 html 转 pdf. +// 中文说明:http://www.jianshu.com/p/4d65857ffe5e# +func ConverterHtmlToPdf(uri []string,path string) (error) { + exe := beego.AppConfig.String("wkhtmltopdf") + + if exe == "" { + return errors.New("wkhtmltopdf not exist.") + } + params := []string{"/C",exe,"--margin-bottom","25"} + + params = append(params,uri...) + params = append(params,path) + + cmd := exec.Command("/bin/bash",params...) + + stdout, err := cmd.StdoutPipe() + + if err != nil { + return errors.New("StdoutPipe: " + err.Error()) + } + stderr, err := cmd.StderrPipe() + if err != nil { + + return errors.New("StderrPipe: " + err.Error()) + } + + if err := cmd.Start(); err != nil { + + return errors.New("Start: "+ err.Error()) + } + + reader := bufio.NewReader(stdout) + + //实时循环读取输出流中的一行内容 + for { + line ,err2 := reader.ReadString('\n') + + if err2 != nil || io.EOF == err2 { + break + } + + beego.Info(line) + } + + bytesErr, err := ioutil.ReadAll(stderr) + + if err == nil { + beego.Info(string(bytesErr)) + }else{ + beego.Error("Error: Stderr => " + err.Error()) + return err + } + + if err := cmd.Wait(); err != nil { + + beego.Error("Error: ", err.Error()) + + return err + } + + return nil +} diff --git a/utils/pdf_windows.go b/utils/pdf_windows.go index d9199447..e0704996 100644 --- a/utils/pdf_windows.go +++ b/utils/pdf_windows.go @@ -2,20 +2,23 @@ package utils import ( "os/exec" - "fmt" "bufio" - "github.com/axgle/mahonia" "io" "io/ioutil" + "errors" + + "github.com/axgle/mahonia" "github.com/astaxie/beego" ) + +// 使用 wkhtmltopdf 是实现 html 转 pdf. // 中文说明:http://www.jianshu.com/p/4d65857ffe5e# -func ConverterHtmlToPdf(uri []string,path string) { +func ConverterHtmlToPdf(uri []string,path string) (error) { exe := beego.AppConfig.String("wkhtmltopdf") if exe == "" { - panic("wkhtmltopdf not exist.") + return errors.New("wkhtmltopdf not exist.") } params := []string{"/C",exe,"--margin-bottom","25"} @@ -28,18 +31,17 @@ func ConverterHtmlToPdf(uri []string,path string) { stdout, err := cmd.StdoutPipe() if err != nil { - fmt.Println("StdoutPipe: " + err.Error()) - return + return errors.New("StdoutPipe: " + err.Error()) } stderr, err := cmd.StderrPipe() if err != nil { - fmt.Println("StderrPipe: ", err.Error()) - return + + return errors.New("StderrPipe: " + err.Error()) } if err := cmd.Start(); err != nil { - fmt.Println("Start: ", err.Error()) - return + + return errors.New("Start: "+ err.Error()) } reader := bufio.NewReader(stdout) @@ -53,25 +55,25 @@ func ConverterHtmlToPdf(uri []string,path string) { break } - beego.Error(enc.ConvertString(line)) + beego.Info(enc.ConvertString(line)) } bytesErr, err := ioutil.ReadAll(stderr) if err == nil { - beego.Error(enc.ConvertString(string(bytesErr))) + beego.Info(enc.ConvertString(string(bytesErr))) }else{ beego.Error("Error: Stderr => " + err.Error()) + return err } if err := cmd.Wait(); err != nil { beego.Error("Error: ", err.Error()) - return + return err } - - return + return nil }