Browse Source

feat:新增ppt转图片接口

Roc 2 năm trước cách đây
mục cha
commit
e16f3162ca

+ 139 - 0
controllers/image.go

@@ -1,12 +1,17 @@
 package controllers
 
 import (
+	"encoding/json"
 	"fmt"
 	"hongze/hongze_public_api/models"
 	"hongze/hongze_public_api/services"
+	"hongze/hongze_public_api/services/ppt2img"
 	"hongze/hongze_public_api/utils"
+	"io/ioutil"
 	"os"
 	"os/exec"
+	"path"
+	"strings"
 	"time"
 )
 
@@ -188,3 +193,137 @@ func (this *ImageController) Base64Upload() {
 	br.Data = resp
 	return
 }
+
+// Ppt2Image
+// @Title ppt转图片
+// @Description ppt转图片
+// @Param	request	body models.Ppt2ImgReq true "type json string"
+// @Success 200 新增成功
+// @router /ppt2img [post]
+func (this *ImageController) Ppt2Image() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	body := this.Ctx.Input.RequestBody
+	req := new(models.Ppt2ImgReq)
+	err := json.Unmarshal(body, &req)
+	if err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.PptUrl == "" {
+		br.Msg = "参数错误,ppt下载地址不能为空"
+		return
+	}
+
+	// 下载ppt
+	pptPath,err := utils.DownloadImage(req.PptUrl)
+	if err != nil{
+		br.Msg = "下载ppt失败"
+		br.ErrMsg = "下载ppt失败,Err:"+err.Error()
+		return
+	}
+	defer func() {
+		os.Remove(pptPath)
+	}()
+
+	// ppt转pdf
+	converterType := "pdf"
+	pdfPath, err := ppt2img.FuncDocs2Pdf(utils.LibreOfficePath, pptPath, "./static/pdf", converterType)
+	if err != nil{
+		br.Msg = "ppt转pdf失败"
+		br.ErrMsg = "ppt转pdf失败,Err:"+err.Error()
+		return
+	}
+	defer func() {
+		// 删除指定pdf目录
+		os.Remove(pdfPath)
+	}()
+
+	// 生成临时存放图片的目录
+	uploadDir := "./static/pdf/png/"+utils.GetRandStringNoSpecialChar(16)+"/"
+	{
+		if !utils.FileIsExist(uploadDir) {
+			err := os.MkdirAll(uploadDir, 0777)
+			if err != nil {
+				br.Msg = "创建存放图片的目录失败"
+				br.ErrMsg = "创建存放图片的目录失败,Err:"+err.Error()
+				return
+			}
+		}
+	}
+	defer func() {
+		// 删除指定临时目录
+		os.RemoveAll(uploadDir)
+	}()
+
+	pdfPathList := strings.Split(pdfPath,"/")
+	pngName := strings.Split(path.Base(pdfPathList[len(pdfPathList)-1]), ".")[0]	//图片名称
+	convPngName := uploadDir + pngName+".png"
+
+	// pdf 转图片
+	_,err = ppt2img.Pdf2Img(pdfPath,convPngName)
+	if err != nil{
+		br.Msg = "pdf转png失败"
+		br.ErrMsg = "pdf转png失败,Err:"+err.Error()
+		return
+	}
+
+	// oss的图片存放地址
+	resourceUrlList := make([]string,0)
+
+
+	// 获取生成的文件列表
+	fileInfoList,err := ioutil.ReadDir(uploadDir)
+	if err != nil {
+		br.Msg = "获取生成的文件列表失败"
+		br.ErrMsg = "获取生成的文件列表失败,Err:"+err.Error()
+		return
+	}
+	countFile := len(fileInfoList)
+	for i:=0;i<countFile;i++{
+		tmpFilePath := fmt.Sprintf("%s%s-%d.png",uploadDir,pngName,i)
+		if utils.FileIsExist(tmpFilePath){
+			resourceUrl,tmpErr := uploadToAliOss(tmpFilePath)
+			if tmpErr != nil{
+				br.Msg = "上传图片至oss失败"
+				br.ErrMsg = "上传图片至oss失败,Err:"+err.Error()
+				return
+			}
+			resourceUrlList = append(resourceUrlList,resourceUrl)
+		}else{
+			br.Msg = "上传图片至oss失败"
+			br.ErrMsg = "上传图片至oss失败,Err:"+err.Error()
+			return
+		}
+	}
+
+	br.Ret = 200
+	br.Msg = "转换成功"
+	br.Data = resourceUrlList
+	return
+}
+
+// 上传文件到阿里云
+func uploadToAliOss(outFileName string) (resourceUrl string,err error) {
+	var saveToOssPath string
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	uploadDir := "static/images/"
+	saveToOssPath = uploadDir + time.Now().Format("200601/20060102/")
+
+	saveToOssPath += randStr + ".png"
+
+	//上传到阿里云
+	//fmt.Println("upload:", outFileName, saveToOssPath)
+	err = services.UploadFileToAliyun("", outFileName, saveToOssPath)
+	if err != nil {
+		return
+	}
+	fileHost := "https://hzstatic.hzinsights.com/"
+	resourceUrl = fileHost + saveToOssPath
+	return
+}

BIN
hongze_public_api


+ 5 - 0
models/image.go

@@ -3,3 +3,8 @@ package models
 type ResourceResp struct {
 	ResourceUrl string `description:"资源地址"`
 }
+
+// Ppt2ImgReq ppt转图片请求
+type Ppt2ImgReq struct {
+	PptUrl          string   `description:"ppt的下载地址"`
+}

+ 37 - 0
routers/commentsRouter.go

@@ -0,0 +1,37 @@
+package routers
+
+import (
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/beego/beego/v2/server/web/context/param"
+)
+
+func init() {
+
+    beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"] = append(beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"],
+        beego.ControllerComments{
+            Method: "Ppt2Image",
+            Router: `/ppt2img`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"] = append(beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"],
+        beego.ControllerComments{
+            Method: "Base64Upload",
+            Router: `/svg_to_png`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:WechatController"] = append(beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:WechatController"],
+        beego.ControllerComments{
+            Method: "SendTemplateMsg",
+            Router: `/send_template_msg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+}

+ 9 - 0
routers/commentsRouter_controllers.go

@@ -7,6 +7,15 @@ import (
 
 func init() {
 
+    beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"] = append(beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"],
+        beego.ControllerComments{
+            Method: "Ppt2Image",
+            Router: "/ppt2img",
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"] = append(beego.GlobalControllerRouter["hongze/hongze_public_api/controllers:ImageController"],
         beego.ControllerComments{
             Method: "Base64Upload",

+ 92 - 0
services/ppt2img/pp2img.go

@@ -0,0 +1,92 @@
+package ppt2img
+
+import (
+	"bytes"
+	"fmt"
+	"os"
+	"os/exec"
+	"path"
+	"strings"
+)
+
+//FuncDocs2Pdf
+/**
+*@tips libreoffice 转换指令:
+* libreoffice6.2 invisible --convert-to pdf csDoc.doc --outdir /home/[转出目录]
+*
+* @function 实现文档类型转换为pdf或html
+* @param command:libreofficed的命令(具体以版本为准);win:soffice; linux:libreoffice6.2
+*     fileSrcPath:转换文件的路径
+*         fileOutDir:转换后文件存储目录
+*       converterType:转换的类型pdf/html
+* @return fileOutPath 转换成功生成的文件的路径 error 转换错误
+ */
+func FuncDocs2Pdf(command string, fileSrcPath string, fileOutDir string, converterType string) (fileOutPath string, error error) {
+	//校验fileSrcPath
+	srcFile, erByOpenSrcFile := os.Open(fileSrcPath)
+	if erByOpenSrcFile != nil && os.IsNotExist(erByOpenSrcFile) {
+		return "", erByOpenSrcFile
+	}
+	//如文件输出目录fileOutDir不存在则自动创建
+	outFileDir, erByOpenFileOutDir := os.Open(fileOutDir)
+	if erByOpenFileOutDir != nil && os.IsNotExist(erByOpenFileOutDir) {
+		erByCreateFileOutDir := os.MkdirAll(fileOutDir, os.ModePerm)
+		if erByCreateFileOutDir != nil {
+			fmt.Println("File ouput dir create error.....", erByCreateFileOutDir.Error())
+			return "", erByCreateFileOutDir
+		}
+	}
+	//关闭流
+	defer func() {
+		_ = srcFile.Close()
+		_ = outFileDir.Close()
+	}()
+	//convert
+	cmd := exec.Command(command, "--invisible", "--convert-to", converterType,
+		fileSrcPath, "--outdir", fileOutDir)
+	_, errByCmdStart := cmd.Output()
+	//命令调用转换失败
+	if errByCmdStart != nil {
+		return "", errByCmdStart
+	}
+	//success
+	fileOutPath = fileOutDir + "/" + strings.Split(path.Base(fileSrcPath), ".")[0]
+	if converterType == "html" {
+		fileOutPath += ".html"
+	} else {
+		fileOutPath += ".pdf"
+	}
+	//fmt.Println("文件转换成功...", string(byteByStat))
+	return fileOutPath, nil
+}
+
+//Pdf2Img
+/**
+*@tips libreoffice 转换指令:
+* libreoffice6.2 invisible --convert-to pdf csDoc.doc --outdir /home/[转出目录]
+*
+* @function 实现文档类型转换为pdf或html
+* @param command:libreofficed的命令(具体以版本为准);win:soffice; linux:libreoffice6.2
+*     fileSrcPath:转换文件的路径
+*         fileOutDir:转换后文件存储目录
+*       converterType:转换的类型pdf/html
+* @return fileOutPath 转换成功生成的文件的路径 error 转换错误
+ */
+func Pdf2Img(fileSrcPath string, fileOutDir string) (fileOutPath string, error error) {
+	fmt.Println("fileSrcPath:",fileSrcPath)
+	fmt.Println("fileOutDir:",fileOutDir)
+	//convert
+	//convert -resize 1100x -density 200 -quality 200 双重挤压下的能化产品何去何从?.pdf 双重挤压下的能化产品何去何从?.png
+	convertCmd:="convert -resize 1100x -density 200 -quality 200 "+fileSrcPath+" "+fileOutDir
+	cmd := exec.Command("/bin/bash", "-c", convertCmd)
+	var out bytes.Buffer
+	cmd.Stdout = &out
+	err := cmd.Run()
+	if err!=nil {
+		fmt.Println("cmd.Run Err:",err.Error())
+	}
+	fmt.Println(convertCmd)
+
+	fmt.Println("文件转换成功...", out.String())
+	return fileOutPath, nil
+}

+ 9 - 0
utils/config.go

@@ -23,6 +23,9 @@ var (
 	WxAppSecret         string
 )
 
+// LibreOfficePath LibreOfficePath的地址
+var LibreOfficePath string
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -65,6 +68,12 @@ func init() {
 		panic(Re)
 	}
 
+	tmpLibreOfficePath, err := web.AppConfig.String("libreOfficePath")
+	if err != nil {
+		panic("配置文件读取libreOfficePath错误 " + err.Error())
+	}
+	LibreOfficePath = tmpLibreOfficePath
+
 	beeLogger.Log.Info(RunMode + " 模式")
 	if RunMode == "release" {