Golang 上传Office文档并转化为PDF


本文摘自网络,作者hulu,侵删。

之前介绍了利用libreoffice 将office文件转化pdf并处理中文乱码的问题 不清楚的同学点击这里 使用LibreOffice将word转化为pdf -解决中文乱码 现在结合Golang 实现文件上传和并生成PDF链接地址 upload.html 上传页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload</title>
</head>
<body>

<h1>Office Transport to pdf</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
    <p><input type="file" name="file"></p>
    <p><input type="submit" value="submit"></p>
</form>
</body>
</html>

upload处理

func Upload(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE")
    w.Header().Add("Access-Control-Allow-Headers", "Content-Type;x-requested-with") // header的类型
    w.Header().Set("Content-Type", "application/json")
    file, header, err := req.FormFile("file")

    if err != nil {
        data := map[string]interface{}{
            "code":    -1,
            "message": "upload file error",
        }
        response(w, data)
        return
    }
    year := time.Now().Year()
    month := int(time.Now().Month())
    day := time.Now().Day()
    tempPath := fmt.Sprintf("./static/tmp/")
    outPutPath := fmt.Sprintf("./static/pdf/%d/%d/%d", year, month, day)
    checkPath(tempPath)

    rand.Seed(time.Now().UnixNano())
    randNum := rand.Intn(100)
    fileName := fmt.Sprintf("%s-%d", time.Now().Format("20060102-15_04_05"), randNum)

    suffix := []string{".xls", ".xlsx", ".doc", ".docx", ".ppt", ".pptx", ".pdf"}
    fileType := ""
    for _, v := range suffix {
        if strings.HasSuffix(header.Filename, v) {
            fileType = v
            break
        }
    }
    needExport := true
    exportName := fileName

    if fileType == "" {
        data := map[string]interface{}{
            "code":    -1,
            "message": "upload file type error",
        }
        response(w, data)
        return
    } else if fileType == ".pdf" {
        fileName = outPutPath + "/" + fileName + fileType
        needExport = false
    } else {
        fileName = tempPath + fileName + fileType
    }

    dst, err := os.Create(fileName)
    defer dst.Close()
    if err != nil {
        log.Errorf("upload file error")
        data := map[string]interface{}{
            "code":    -1,
            "message": "upload file error",
        }
        response(w, data)
        return
    }
    _, err = io.Copy(dst, file)
    if err != nil {
        log.Errorf("copy file error")
        data := map[string]interface{}{
            "code":    -1,
            "message": "copy file error",
        }
        response(w, data)
        return
    }
    if needExport {
        err := exportToPdf(fileName, outPutPath)
        if err != nil {
            log.Errorf("output file error")
            data := map[string]interface{}{
                "code":    -1,
                "message": "output file error",
            }
            response(w, data)
            return
        }
        os.Remove(fileName) //删除上传文件
    }
    exportName = strings.TrimPrefix(outPutPath+"/"+exportName+".pdf", "./")
    data := map[string]interface{}{
        "code": 0,
        "url":  WebAgent.Host + "/" + exportName,
    }

    response(w, data)
    return

}

checkPath 检查目录是否存在

//checkPath 检查目录是否存在并创建
func checkPath(path string) error {
    _, err := os.Stat(path)
    if err != nil && os.IsNotExist(err) {
        err := os.MkdirAll(path, os.ModePerm)
        if err != nil {
            return err
        }
    }
    return nil
}

golang 调用系统命令导出为pdf

func exportToPdf(filename string, outPath string) error {
    checkPath(outPath)
    lock.Lock()
    defer lock.Unlock()
    cmd := exec.Command("libreoffice7.0", "--invisible", "--language=zh-CN", "--convert-to", "pdf",
        filename, "--outdir", outPath)
    cmd.Stdout = os.Stdout

    err := cmd.Run()
    if err != nil {
        log.Errorf("transport pdf err:%v", err)
        return err
    }
    return nil
}


相关阅读 >>

leetcode 115. 不同的子序列 Golang

Golang怎么执行cmd命令行

Golang的memcache如何简单实现

Golang学习笔记——面向对象(接口)

Go基础编程:数据类型

Golang无法导包怎么办?

Golang 获取三种不同的路径方法(执行路径,项目路径,文件路径)

n皇后问题(Go版本)

Golang的优势在哪里

Go语言两种版本的hello world你会吗

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...