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