使用golang提供pdf

时间:2017-07-25 11:35:42

标签: pdf go

只是想知道你们是否可以提供一些代码帮助。

它可以提供图像,但不是pdf手册。 提前致谢

func main(){
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
        filename    := "/var/www/filedipenser/brochure.pdf"

        streamPDFbytes, err := ioutil.ReadFile( filename )

        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }

        b := bytes.NewBuffer(streamPDFbytes)

        w.Header().Set("Content-type", "application/pdf")

        if _, err := b.WriteTo(w); err != nil {
            fmt.Fprintf(w, "%s", err)
        }

        w.Write([]byte("PDF Generated"))
    })

    err := http.ListenAndServe(":4111", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
        fmt.Println(err)
    }
}

enter image description here

1 个答案:

答案 0 :(得分:6)

代码效率有点但似乎有效。但是,某些PDF查看器可能对您添加到HTTP响应流末尾的无关输出很敏感。删除w.Write([]byte("PDF Generated")),因为这会破坏输出。如果您想进行调试,可以将其更改为fmt.Println

效率低下的原因是您将整个PDF文件加载到内存中然后发送到客户端。对于大文件,这将浪费内存。您最好使用io.Reader打开文件并直接从文件(io.Writer)流式传输到响应(io.Copy)。类似的东西:

    // Open file
    f, err := os.Open(filename)
    if err != nil {
        fmt.Println(err)
        w.WriteHeader(500)
        return
    }
    defer f.Close()

    //Set header
    w.Header().Set("Content-type", "application/pdf")

    //Stream to response
    if _, err := io.Copy(w, f); err != nil {
        fmt.Println(err)
        w.WriteHeader(500)
    }

你显然想要更好地处理错误,这只是一个例子。但是,在遇到错误时,客户端会收到HTTP错误响应,这一点非常重要,因此它会发现请求失败。