소스 검색

wip: 文档格式转换

wangshan 1 년 전
부모
커밋
8bea57faa3

+ 115 - 0
rpc/partnerlib/conversion/conversion.go

@@ -0,0 +1,115 @@
+package conversion
+
+import (
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/util"
+	"app.yhyue.com/moapp/jy_docs/services/model"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	"app.yhyue.com/moapp/jyfs/rpc/filesystem"
+	"fmt"
+	"log"
+	"os"
+	"os/exec"
+	"sync"
+	"time"
+)
+
+type Conversion struct {
+	DocId    string
+	FileName string
+	FileId   string
+	Suffix   string
+	Content  []byte
+	Size     int
+}
+
+var (
+	CL         = &sync.Mutex{}
+	filePath   = "conversion/input"
+	fileSuffix = "pdf"
+)
+
+func NewConversion(docId, fileName, fileId, suffix string, b []byte, size int) *Conversion {
+	return &Conversion{
+		DocId:    docId,
+		FileName: fileName,
+		FileId:   fileId,
+		Suffix:   suffix,
+		Content:  b,
+		Size:     size,
+	}
+}
+func (c *Conversion) ToConversion() {
+	CL.Lock()
+	defer CL.Unlock()
+	// 检查目录是否存在
+	_, err := os.Stat(filePath)
+	if os.IsNotExist(err) {
+		// 创建输出文件夹
+		err := os.MkdirAll(filePath, 0755)
+		if err != nil {
+			fmt.Println("Error creating output folder:", err)
+			return
+		}
+	}
+	//写入文件
+	inputFilename := fmt.Sprintf("%s/%s.%s", filePath, c.FileId, c.Suffix)
+	file, err := os.Create(inputFilename)
+	if err != nil {
+		fmt.Println("Error creating file:", err)
+		return
+	}
+	defer file.Close()
+	// 设置文件权限
+	err = file.Chmod(0777)
+	if err != nil {
+		fmt.Printf("Error setting file permissions for %s: %v\n", filePath, err)
+		return
+	}
+	// 写入文件流
+	_, err = file.Write(c.Content)
+	if err != nil {
+		fmt.Println("Error writing to file:", err)
+		return
+	}
+	// 开始执行转换
+	cmd := exec.Command("unoconv", "-f", fileSuffix, inputFilename)
+	cmd.Stdout = nil
+	cmd.Stderr = nil
+	err = cmd.Run()
+	if err != nil {
+		log.Println(fmt.Errorf("conversion failed: %w", err))
+		return
+	}
+	pdfFile := fmt.Sprintf("%s/%s.%s", filePath, c.FileId, fileSuffix)
+	c.Content, err = os.ReadFile(pdfFile)
+	if err != nil {
+		fmt.Println(fmt.Errorf("read pdf err:%s", err.Error()))
+		return
+	}
+	if len(c.Content) > 0 {
+		//上传文件
+		fileRes := util.FileUpload(&filesystem.SaveFileReq{
+			Domain: IC.C.OssInfo.BucketName,
+			FileId: fmt.Sprintf("%s.%s", c.FileId, fileSuffix),
+			Meta: map[string]string{
+				"docName":   c.FileName,
+				"docSuffix": fileSuffix,
+				"docSize":   fmt.Sprintf("%d", c.Size),
+			},
+			RawFileContent: c.Content,
+			Charset:        util.GetFileChardet(c.Content),
+		})
+		if fileRes.OssDocId == "" {
+			fmt.Println(" upload oss err:", fileRes.Msg)
+		} else {
+			if err = partner.DocsUpdate(2, model.Doc{
+				Id:         c.DocId,
+				OssPdfId:   fmt.Sprintf("%s.%s", c.FileId, fileSuffix),
+				UpdateDate: time.Now(),
+			}); err != nil {
+				log.Println(" update doc  osspdfid err :", err.Error())
+			}
+		}
+	}
+}

BIN
rpc/partnerlib/conversion/input/dc2687989f5a2c2f91c5a9a40d5ffb29.doc


+ 5 - 1
rpc/partnerlib/etc/partnerlib.yaml

@@ -34,8 +34,12 @@ Mongo:
     Password: "123456"
 FileSystemConf:
   Hosts:
-    - 192.168.3.206:2379
+    - 127.0.0.1:2379
   Key: moapp.filesystem.rpc
   Timeout: 20000
 OssInfo:
   BucketName: jydocs-std #上线前需要配置新bucket
+Conversion:
+  Switch: true
+  DocFormat:
+    doc: true

+ 4 - 0
rpc/partnerlib/internal/config/config.go

@@ -17,4 +17,8 @@ type Config struct {
 	OssInfo        struct {
 		BucketName string
 	}
+	Conversion struct {
+		Switch    bool
+		DocFormat map[string]bool
+	}
 }

+ 5 - 1
rpc/partnerlib/service/docDownload.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/conversion"
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
 	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
@@ -66,7 +67,7 @@ func DocDownload(in *partnerlib.UserDownloadRequest) (res *partnerlib.UDRes, err
 						redis.Del(entity.RedisCode, fileUploadCache)
 					}()
 					//获取附件后上传oss
-					fileRes := FileUpload(&filesystem.SaveFileReq{
+					fileRes := util.FileUpload(&filesystem.SaveFileReq{
 						Domain: IC.C.OssInfo.BucketName,
 						FileId: _ossId,
 						Meta: map[string]string{
@@ -80,6 +81,9 @@ func DocDownload(in *partnerlib.UserDownloadRequest) (res *partnerlib.UDRes, err
 					if fileRes.OssDocId == "" {
 						err = fmt.Errorf("文档上传失败")
 						warn.SendMsgByWXURL(fmt.Sprintf("文档id:%s,文档名称:%s,上传到oss异常:%s", _docInfo.Id, _docInfo.DocName, err.Error()))
+					} else if IC.C.Conversion.Switch && IC.C.Conversion.DocFormat[_docInfo.DocFileSuffix] {
+						//转换pdf
+						conversion.NewConversion(_docInfo.Id, _docInfo.DocName, _fileId, _docInfo.DocFileSuffix, b, _docInfo.DocFileSize).ToConversion()
 					}
 				}(ossId, fileId, fileUploadCache, docInfo)
 				//更新doc

+ 1 - 1
rpc/partnerlib/test/fileUpload_test.go

@@ -93,7 +93,7 @@ func Test_GetFile(t *testing.T) {
 	}))
 	resp, err := jyFilelLib.GetOssUril(gctx.New(), &filesystem.LoadFileReq{
 		Domain: Domain,
-		FileId: "dc2687989f5a2c2f91c5a9a40d5ffb29.pdf",
+		FileId: "dc2687989f5a2c2f91c5a9a40d5ffb29.doc",
 	})
 	log.Println(resp, "-----", err)
 }

+ 1 - 1
rpc/partnerlib/service/ossFileUpload.go → rpc/partnerlib/util/ossFileUpload.go

@@ -1,4 +1,4 @@
-package service
+package util
 
 import (
 	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"

+ 2 - 0
services/partner/docsUpdate.go

@@ -20,6 +20,8 @@ func DocsUpdate(state int, doc model.Doc) (err error) {
 		updateMap["productType"] = doc.ProductType
 		updateMap["downOrUp"] = doc.DownOrUp
 		updateMap["priceVip"] = doc.PriceVip
+	case 2:
+		updateMap["ossPdfId"] = doc.OssPdfId
 	}
 	err = docRpcUtil.GetJyDocsDB().Table(entity.DocTable).Where("id=?", doc.Id).Updates(updateMap).Error
 	if err != nil {