svg-to-dxf/main.go

93 lines
1.8 KiB
Go

package main
import (
"errors"
"fmt"
"io"
"math/rand"
"net/http"
"os"
"os/exec"
)
var port = os.Getenv("PORT")
func main() {
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
svgURL := r.URL.Query().Get("url")
if svgURL == "" {
return
}
fmt.Println("Fetching " + svgURL)
filename := "/app/" + randomString(7) + ".svg"
fmt.Println("Filename: " + filename)
if err := downloadFile(svgURL, filename); err != nil {
fmt.Fprintf(w, err.Error())
return
}
fmt.Println("Downloaded SVG")
dxf, err := convertToDXF(filename)
if err != nil {
fmt.Fprintf(w, err.Error())
return
}
fmt.Println("Converted to DXF")
w.Header().Add("Content-Type", "application/octet-stream")
w.Header().Add("Content-Length", fmt.Sprint(len(dxf)))
w.Header().Add("Content-Disposition", "inline; filename=out.dxf")
fmt.Fprintf(w, string(dxf))
os.Remove(filename)
})
fmt.Println(http.ListenAndServe(":"+port, nil))
}
func downloadFile(URL, fileName string) error {
response, err := http.Get(URL)
if err != nil {
return err
}
defer response.Body.Close()
if response.StatusCode != 200 {
return errors.New("Received non 200 response code")
}
file, err := os.Create(fileName)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(file, response.Body)
if err != nil {
return err
}
return nil
}
func convertToDXF(filename string) ([]byte, error) {
cmd := exec.Command("python", "/usr/share/inkscape/extensions/dxf_outlines.py", filename)
return cmd.Output()
}
func randomString(n int) string {
var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
s := make([]rune, n)
for i := range s {
s[i] = letters[rand.Intn(len(letters))]
}
return string(s)
}