forked from phelian/fillpdf
/
utils.go
133 lines (120 loc) · 3.09 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
* FillPDF - Fill PDF forms
* Copyright DesertBit
* Author: Roland Singer, Alexander Félix
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package fillpdf
import (
"bytes"
"crypto/rand"
"fmt"
"io"
"os"
"os/exec"
"path/filepath"
"strings"
)
func getAbs(path string) (string, error) {
// Get the absolute paths.
absPath, err := filepath.Abs(path)
if err != nil {
return "", fmt.Errorf("failed to get the absolute path: %v", err)
}
// Check if the form file exists.
e, err := exists(path)
if err != nil {
return "", fmt.Errorf("failed to check if file exists: %v", err)
} else if !e {
return "", fmt.Errorf("file does not exists: '%s'", path)
}
return absPath, nil
}
// exists returns whether the given file or directory exists or not
func exists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
// copyFile copies the contents of the file named src to the file named
// by dst. The file will be created if it does not already exist. If the
// destination file exists, all it's contents will be replaced by the contents
// of the source file.
func copyFile(src, dst string) (err error) {
in, err := os.Open(src)
if err != nil {
return
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return
}
defer func() {
cerr := out.Close()
if err == nil {
err = cerr
}
}()
if _, err = io.Copy(out, in); err != nil {
return
}
err = out.Sync()
return
}
// runCommandInPath runs a command and waits for it to exit.
// The working directory is also set.
// The stderr error message is returned on error.
func runCommandInPath(dir, name string, args ...string) error {
// Create the command.
var stderr bytes.Buffer
cmd := exec.Command(name, args...)
cmd.Stderr = &stderr
cmd.Dir = dir
// Start the command and wait for it to exit.
err := cmd.Run()
if err != nil {
return fmt.Errorf(strings.TrimSpace(stderr.String()))
}
return nil
}
func runCommandWithOutput(dir, name string, args ...string) ([]byte, error) {
// Create the command.
var stderr bytes.Buffer
var stdout bytes.Buffer
cmd := exec.Command(name, args...)
cmd.Stderr = &stderr
cmd.Stdout = &stdout
cmd.Dir = dir
// Start the command and wait for it to exit.
err := cmd.Run()
if err != nil {
return nil, fmt.Errorf(strings.TrimSpace(stderr.String()))
}
return stdout.Bytes(), nil
}
//create Random ID
func GetID(prefix string) (string, error) {
b := make([]byte, 8)
_, err := rand.Read(b)
if err != nil {
return "", err
}
return fmt.Sprintf("%s_%x", prefix, b), nil
}