utils.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package utils
  2. import (
  3. "fmt"
  4. "sync"
  5. //"fmt"
  6. //"html"
  7. //"net/mail"
  8. "bytes"
  9. "os"
  10. "os/exec"
  11. "regexp"
  12. "time"
  13. //"reflect"
  14. "encoding/base64"
  15. "io/ioutil"
  16. "strings"
  17. "golang.org/x/net/html/charset"
  18. //"errors"
  19. //"strings"
  20. //"encoding/json"
  21. //"gopkg.in/mgo.v2"
  22. //"gopkg.in/mgo.v2/bson"
  23. //"git.gojus.com.br/eugeniucarvalho/gojus/shared"
  24. //"git.gojus.com.br/eugeniucarvalho/gojus/config"
  25. //"git.gojus.com.br/eugeniucarvalho/gojus/services"
  26. )
  27. type MutexCounter struct {
  28. Value int64
  29. m sync.Mutex
  30. }
  31. func (t *MutexCounter) Inc(inc int64) *MutexCounter {
  32. t.m.Lock()
  33. t.Value += inc
  34. t.m.Unlock()
  35. return t
  36. }
  37. func (t *MutexCounter) Dec(inc int64) *MutexCounter {
  38. t.m.Lock()
  39. t.Value -= inc
  40. t.m.Unlock()
  41. return t
  42. }
  43. func (t *MutexCounter) Eq(val int64) bool {
  44. return t.Value == val
  45. }
  46. func Now() int64 {
  47. return time.Now().Unix()
  48. }
  49. func ToUTF8(str, origEncoding string) string {
  50. byteReader := bytes.NewReader([]byte(str))
  51. reader, _ := charset.NewReaderLabel(origEncoding, byteReader)
  52. strBytes, _ := ioutil.ReadAll(reader)
  53. return string(strBytes)
  54. }
  55. func FileGetContents(filename string) (string, error) {
  56. b, err := ioutil.ReadFile(filename)
  57. if err != nil {
  58. return "", err
  59. }
  60. return string(b), nil
  61. }
  62. func FilePutContents(filename string, content string, perm os.FileMode) error {
  63. return FilePutContentsBytes(filename, []byte(content), perm)
  64. }
  65. func FilePutContentsBytes(filename string, content []byte, perm os.FileMode) error {
  66. var (
  67. err error
  68. f *os.File
  69. )
  70. if err = ioutil.WriteFile(filename, []byte(""), perm); err != nil {
  71. return err
  72. }
  73. if f, err = os.Create(filename); err != nil {
  74. return err
  75. }
  76. defer f.Close()
  77. _, err = f.Write(content)
  78. return err
  79. }
  80. func RemoveFile(file string) error {
  81. if err := os.Remove(file); err != nil {
  82. return err
  83. }
  84. return nil
  85. }
  86. func Encode(delimiter string, values ...string) string {
  87. return ToBase64(strings.Join(values, delimiter))
  88. }
  89. func ToBase64(s string) string {
  90. return base64.StdEncoding.EncodeToString([]byte(s))
  91. }
  92. func FromBase64(value string) (string, error) {
  93. dec, err := base64.StdEncoding.DecodeString(value)
  94. return string(dec), err
  95. }
  96. func Decode(delimiter, value string) ([]string, error) {
  97. decoded, err := FromBase64(value)
  98. if err != nil {
  99. return []string{}, err
  100. }
  101. return strings.Split(string(decoded), delimiter), nil
  102. }
  103. type Thumbnail struct {
  104. Resolution string
  105. // Adiciona o arquivo de entrada
  106. // path e o caminho do arquivo e pages sao as paginas a serem convertidas
  107. // pages = "[0]" - representa a pagina 1
  108. // pages = "" - representa todas as paginas
  109. Input string
  110. Output string
  111. InExt string
  112. Page string
  113. }
  114. func NewThumbnail() *Thumbnail {
  115. t := &Thumbnail{}
  116. t.Resolution = "x300"
  117. return t
  118. }
  119. var (
  120. ThumbSoffice = regexp.MustCompile("(doc|ppt|pps|pot|xls|xlt|xlw|dot|csv|txt|rtf)(x|m)?")
  121. )
  122. func (t *Thumbnail) Gen() error {
  123. var err error
  124. if t.Input == "" {
  125. return fmt.Errorf("Input is empty")
  126. }
  127. if t.InExt == "" {
  128. // todo -- pegar a extensao do arquivo de entrada
  129. }
  130. cmd := ""
  131. remove := false
  132. // Converte alguns tipos de arquivo para a imagem para depois converter para thumbnail
  133. if ThumbSoffice.Match([]byte(strings.ToLower(t.InExt))) {
  134. //cmd = "convert -thumbnail %s -background white -alpha remove %s %s"
  135. cmd = "soffice --headless --convert-to png --outdir %s %s"
  136. index := strings.LastIndex(t.Output, "/")
  137. outputdir := t.Output[0:index]
  138. if err = Exec(fmt.Sprintf(cmd, outputdir, t.Input)); err != nil {
  139. return err
  140. }
  141. t.Input = t.Output
  142. // strings.Replace(t.Input, t.InExt, ".png", -1)
  143. fmt.Println("new input -", t.InExt, "-", t.Input)
  144. remove = true
  145. }
  146. // Cria o thumbnail
  147. cmd = "convert -thumbnail %s -background white -alpha remove %s %s"
  148. Exec(fmt.Sprintf(cmd, t.Resolution, t.Input+t.Page, t.Output))
  149. // Apaga o arquivo temporario gerado pela conversao intermediaria
  150. if remove {
  151. // RemoveFile(t.Input)
  152. }
  153. return nil
  154. }
  155. func Exec(cmd string) error {
  156. fmt.Println("Executando .. ", cmd)
  157. out, err := exec.Command("bash", "-c", cmd).Output()
  158. if err != nil {
  159. fmt.Println("error occured ", err.Error())
  160. return err
  161. }
  162. fmt.Println("out >> ", string(out))
  163. return err
  164. }
  165. /*
  166. func Push(slice interface{}, el interface{}, call func(interface{}) bool) {
  167. switch reflect.TypeOf(slice).Kind() {
  168. case reflect.Slice:
  169. s := reflect.ValueOf(t)
  170. push := true
  171. item := reflect.ValueOf(el).Elem()
  172. for i := 0; i < s.Len(); i++ {
  173. push = call(s. ,item)
  174. }
  175. if push {
  176. s = append(s, item)
  177. }
  178. }
  179. }
  180. */