pdf - 使用 golang 提供 pdf

标签 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

最佳答案

该代码效率有点低,但它似乎可以正常工作。但是,某些 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 错误响应,以便它知道请求失败。

关于pdf - 使用 golang 提供 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45302083/

相关文章:

javascript - 如何将传入的文件流从 Node 保存到 AngularJS

ios - 如何打开PDF文件中的url

go - sync.Mutex 和 *sync.Mutex 哪个更好?

java - Golang 中的动态加载?

go - 解码时如何合并/修改 json?

go - `switch` 中 `go` 的求值序列

pdf - 我如何使 p :media dynamically resizable for a fluid layout?

Java PDFBox - 阅读和修改带有特殊字符(变音符号)的 pdf

java - Selenium - 复制到剪贴板不适用于嵌入式 pdf

nginx - 在 Phusion Passenger 后面运行一个 Go 网络服务器