使用golang提供pdf

A H*_*ali 1 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Mar*_*ell 7

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

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

    // 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)
    }
Run Code Online (Sandbox Code Playgroud)

你显然想要更好地处理错误,这只是一个例子.但是,重要的是当您遇到错误时会向客户端提供HTTP错误响应,以便它知道请求失败.