conversion.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package conversion
  2. import (
  3. IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
  4. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/util"
  5. "app.yhyue.com/moapp/jy_docs/services/model"
  6. "app.yhyue.com/moapp/jy_docs/services/partner"
  7. "app.yhyue.com/moapp/jyfs/rpc/filesystem"
  8. "fmt"
  9. "log"
  10. "os"
  11. "os/exec"
  12. "sync"
  13. "time"
  14. )
  15. type Conversion struct {
  16. DocId string
  17. FileName string
  18. FileId string
  19. Suffix string
  20. Content []byte
  21. Size int
  22. }
  23. var (
  24. CL = &sync.Mutex{}
  25. filePath = "conversion/input"
  26. fileSuffix = "pdf"
  27. )
  28. func NewConversion(docId, fileName, fileId, suffix string, b []byte, size int) *Conversion {
  29. return &Conversion{
  30. DocId: docId,
  31. FileName: fileName,
  32. FileId: fileId,
  33. Suffix: suffix,
  34. Content: b,
  35. Size: size,
  36. }
  37. }
  38. func (c *Conversion) ToConversion() {
  39. CL.Lock()
  40. defer CL.Unlock()
  41. // 检查目录是否存在
  42. _, err := os.Stat(filePath)
  43. if os.IsNotExist(err) {
  44. // 创建输出文件夹
  45. err := os.MkdirAll(filePath, 0755)
  46. if err != nil {
  47. fmt.Println("Error creating output folder:", err)
  48. return
  49. }
  50. }
  51. //写入文件
  52. inputFile := fmt.Sprintf("%s/%s.%s", filePath, c.FileId, c.Suffix)
  53. file, err := os.Create(inputFile)
  54. if err != nil {
  55. fmt.Println("Error creating file:", err)
  56. return
  57. }
  58. defer file.Close()
  59. // 设置文件权限
  60. err = file.Chmod(0777)
  61. if err != nil {
  62. fmt.Printf("Error setting file permissions for %s: %v\n", filePath, err)
  63. return
  64. }
  65. // 写入文件流
  66. _, err = file.Write(c.Content)
  67. if err != nil {
  68. fmt.Println("Error writing to file:", err)
  69. return
  70. }
  71. // 开始执行转换
  72. cmd := exec.Command("unoconv", "-f", fileSuffix, inputFile)
  73. cmd.Stdout = nil
  74. cmd.Stderr = nil
  75. err = cmd.Run()
  76. if err != nil {
  77. log.Println(fmt.Errorf("conversion failed: %w", err))
  78. return
  79. }
  80. pdfFile := fmt.Sprintf("%s/%s.%s", filePath, c.FileId, fileSuffix)
  81. c.Content, err = os.ReadFile(pdfFile)
  82. if err != nil {
  83. fmt.Println(fmt.Errorf("read pdf err:%s", err.Error()))
  84. return
  85. }
  86. if len(c.Content) > 0 {
  87. //上传文件
  88. fileRes := util.FileUpload(&filesystem.SaveFileReq{
  89. Domain: IC.C.OssInfo.BucketName,
  90. FileId: fmt.Sprintf("%s.%s", c.FileId, fileSuffix),
  91. Meta: map[string]string{
  92. "docName": c.FileName,
  93. "docSuffix": fileSuffix,
  94. "docSize": fmt.Sprintf("%d", c.Size),
  95. },
  96. RawFileContent: c.Content,
  97. Charset: util.GetFileChardet(c.Content),
  98. })
  99. if fileRes.OssDocId == "" {
  100. fmt.Println(" upload oss err:", fileRes.Msg)
  101. } else {
  102. //移除文件
  103. os.Remove(inputFile)
  104. os.Remove(pdfFile)
  105. if err = partner.DocsUpdate(2, model.Doc{
  106. Id: c.DocId,
  107. OssPdfId: fmt.Sprintf("%s.%s", c.FileId, fileSuffix),
  108. UpdateDate: time.Now(),
  109. }); err != nil {
  110. log.Println(" update doc osspdfid err :", err.Error())
  111. }
  112. }
  113. }
  114. }