diff --git a/convert.go b/convert.go index d06434d..68e16b9 100644 --- a/convert.go +++ b/convert.go @@ -6,18 +6,20 @@ import ( "time" ) -func ConvertToPDF(folderPath string, filesPaths []string, contType ContentType) (resultingPath string, error error) { +func ConvertToPDF(folderPath string, filesPaths []string, contType ContentType) (resultingPath string, err error) { switch contType { case Images: return ImagesToPDF(folderPath, filesPaths) case Office: return OfficeToPDF(folderPath, filesPaths) + case Pdfs: + return PdfToPDF(folderPath, filesPaths) default: - return "", fmt.Errorf("Unhandled ContentType with %d index", contType) + return "", fmt.Errorf("unhandled ContentType with %d index", contType) } } -func ImagesToPDF(folderPath string, filesPaths []string) (resultingPath string, error error) { +func ImagesToPDF(folderPath string, filesPaths []string) (resultingPath string, err error) { resultingPath = createResultingPath(folderPath, "Images") if err := runCommand("convert", append(filesPaths, resultingPath)...); err != nil { @@ -27,10 +29,10 @@ func ImagesToPDF(folderPath string, filesPaths []string) (resultingPath string, return resultingPath, nil } -func OfficeToPDF(folderPath string, filesPaths []string) (resultingPath string, error error) { +func OfficeToPDF(folderPath string, filesPaths []string) (resultingPath string, err error) { resultingPath = createResultingPath(folderPath, "Office document") - err := runCommand( + err = runCommand( "soffice", "--headless", "--nologo", "--nofirststartwizard", "--norestore", "--convert-to", "pdf", "--outdir", folderPath, filesPaths[0], ) @@ -38,7 +40,22 @@ func OfficeToPDF(folderPath string, filesPaths []string) (resultingPath string, return "", err } - err = runCommand("mv", folderPath + "/" + "0.pdf", resultingPath) + err = runCommand("mv", folderPath+"/"+"0.pdf", resultingPath) + if err != nil { + return "", err + } + + return resultingPath, nil +} + +func PdfToPDF(folderPath string, filesPath []string) (resultingPath string, err error) { + resultingPath = createResultingPath(folderPath, "PDFs") + + err = runCommand("gs", append([]string{ + "-sDEVICE=pdfwrite", "-dCompressFonts=true", "-dPDFSETTINGS=/ebook", + "-dNOPAUSE", "-dQUIET", "-dBATCH", "-sOutputFile=" + resultingPath, + }, filesPath...)...) + if err != nil { return "", err } diff --git a/main.go b/main.go index a3b8a68..fe32153 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,7 @@ func indexHandler(w http.ResponseWriter, r *http.Request) { const UPLOADS_FOLDER_PREFIX = "./uploads/" -func saveFilesOnDisk(files []*multipart.FileHeader) (folderPath string, filesPaths []string, error error) { +func saveFilesOnDisk(files []*multipart.FileHeader) (folderPath string, filesPaths []string, err error) { // Create folder for uploaded files folderPath = UPLOADS_FOLDER_PREFIX + strconv.FormatInt(time.Now().Unix(), 10) @@ -78,9 +78,10 @@ type ContentType int const ( Images ContentType = iota Office + Pdfs ) -func detectContentType(files []*multipart.FileHeader) (contentType ContentType, error error) { +func detectContentType(files []*multipart.FileHeader) (contentType ContentType, err error) { for _, file := range files { fileExt := strings.ToLower(filepath.Ext(file.Filename)) switch fileExt { @@ -88,10 +89,12 @@ func detectContentType(files []*multipart.FileHeader) (contentType ContentType, if len(files) == 1 { return Office, nil } else { - return contentType, fmt.Errorf("Expected one document, got %d", len(files)) + return contentType, fmt.Errorf("expected one document, got %d", len(files)) } - case ".jpg", ".jpeg", ".png", ".pdf": + case ".jpg", ".jpeg", ".png": contentType = Images + case ".pdf": + contentType = Pdfs default: return contentType, fmt.Errorf("%s file extension is unsupported yet", fileExt) } @@ -140,7 +143,7 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) { return } - w.Header().Set("Content-Disposition", "attachment; filename=\"" + filepath.Base(resFile) + "\"") + w.Header().Set("Content-Disposition", "attachment; filename=\""+filepath.Base(resFile)+"\"") http.ServeFile(w, r, resFile) }