如何在Golang的本地主机网页上查看生成的PDF文件?

huangapple go评论125阅读模式
英文:

How to see generated pdf on localhost webpage in Golang?

问题

我正在尝试在 http://localhost:3333/pdf 上查看生成的 PDF。

我正在尝试使用 Golang 生成 PDF。试图对 PDF 进行更改并在本地服务器上实时查看(http://localhost:3333/pdf)。但是我不知道如何在本地主机上显示 PDF。

我的代码:

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "os"
  8. "github.com/krazybee/gofpdf"
  9. )
  10. type bufWriter struct {
  11. buf []byte
  12. }
  13. func getRoot(w http.ResponseWriter, r *http.Request) {
  14. fmt.Printf("收到 / 请求\n")
  15. io.WriteString(w, "这是我的网站!\n")
  16. }
  17. func getHello(w http.ResponseWriter, r *http.Request) {
  18. fmt.Printf("收到 /hello 请求\n")
  19. io.WriteString(w, "你好,HTTP!\n")
  20. }
  21. func generatePDF(w http.ResponseWriter, r *http.Request) {
  22. pw := new(bufWriter)
  23. pdf := gofpdf.New("P", "mm", "A4", "")
  24. fontsize := 12.0
  25. font := "Arial"
  26. pdf.SetFont("Arial", "", 6)
  27. pdf.AddPage()
  28. pdf.SetMargins(5, 5, 5)
  29. pdf.SetAutoPageBreak(true, 34)
  30. pdf.SetFont(font, "B", fontsize)
  31. pdf.MultiCell(0, 8, "TERMS OF LIVING", "", "C", false)
  32. pdf.MultiCell(0, 8, "Terms", "", "C", false)
  33. // 在本地主机的网页上显示 PDF。
  34. err := pdf.OutputAndClose(pw)
  35. if err != nil {
  36. fmt.Println(err)
  37. return
  38. }
  39. fmt.Println("PDF 服务成功")
  40. }
  41. func main() {
  42. http.HandleFunc("/", getRoot)
  43. http.HandleFunc("/hello", getHello)
  44. http.HandleFunc("/pdf", generatePDF)
  45. err := http.ListenAndServe(":3333", nil)
  46. if errors.Is(err, http.ErrServerClosed) {
  47. fmt.Printf("服务器已关闭\n")
  48. } else if err != nil {
  49. fmt.Printf("启动服务器时出错:%s\n", err)
  50. os.Exit(1)
  51. }
  52. }

这是我尝试的内容。
但是从注释 // 在本地主机的网页上显示 PDF。 开始,我不知道如何继续进行。

有人可以帮助我吗?我该如何在本地主机的网页上查看生成的 PDF?

英文:

I am trying to see my generated pdf on http://localhost:3333/pdf.

I am trying to learn generating pdf using golang. Tying to make the changes in pdf and see live on localhost server ( http://localhost:3333/pdf ).
But I am clueless that how can I show pdf on localhost.

My Code::

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "os"
  8. "github.com/krazybee/gofpdf"
  9. )
  10. type bufWriter struct {
  11. buf []byte
  12. }
  13. func getRoot(w http.ResponseWriter, r *http.Request) {
  14. fmt.Printf("got / request\n")
  15. io.WriteString(w, "This is my website!\n")
  16. }
  17. func getHello(w http.ResponseWriter, r *http.Request) {
  18. fmt.Printf("got /hello request\n")
  19. io.WriteString(w, "Hello, HTTP!\n")
  20. }
  21. func generatePDF(w http.ResponseWriter, r *http.Request) {
  22. pw := new(bufWriter)
  23. pdf := gofpdf.New("P", "mm", "A4", "")
  24. fontsize := 12.0
  25. font := "Arial"
  26. pdf.SetFont("Arial", "", 6)
  27. pdf.AddPage()
  28. pdf.SetMargins(5, 5, 5)
  29. pdf.SetAutoPageBreak(true, 34)
  30. pdf.SetFont(font, "B", fontsize)
  31. pdf.MultiCell(0, 8, "TERMS OF LIVING", "", "C", false)
  32. pdf.MultiCell(0, 8, "Terms", "", "C", false)
  33. // Show the pdf on localhost web page.
  34. err = pdf.OutputAndClose(pw)
  35. if err != nil {
  36. fmt.Println(err)
  37. return
  38. }
  39. fmt.Println("PDF served successfully")
  40. }
  41. func main() {
  42. http.HandleFunc("/", getRoot)
  43. http.HandleFunc("/hello", getHello)
  44. http.HandleFunc("/pdf", generatePDF)
  45. err := http.ListenAndServe(":3333", nil)
  46. if errors.Is(err, http.ErrServerClosed) {
  47. fmt.Printf("server closed\n")
  48. } else if err != nil {
  49. fmt.Printf("error starting server: %s\n", err)
  50. os.Exit(1)
  51. }
  52. }

This is what I have tried.
But from the comment // Show the pdf on the localhost web page. I don't know how to proceed further after that.

Can someone help me how can I do that? How can I see the generated pdf on a localhost web page?

答案1

得分: 1

默认情况下,http包使用Content-Type: text/html头来提供页面。在编写页面内容之前,您需要自己指定所需的头部:

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

然而,您提供的示例代码不起作用,因为io流混乱。以下是您需要更改的内容:

  1. func generatePDF(w http.ResponseWriter, r *http.Request) {
  2. var b bytes.Buffer
  3. pw := io.Writer(&b)
  4. pr := io.Reader(&b)
  5. ...
  6. err := pdf.Output(pw)
  7. ...
  8. w.Header().Set("Content-Type", "application/pdf")
  9. resPDF, _ := ioutil.ReadAll(pr)
  10. w.Write(resPDF)
  11. fmt.Println("PDF served successfully")
  12. }

我建议您多练习一下io库。

以下是对我有效的完整代码:

  1. package main
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "github.com/krazybee/gofpdf"
  11. )
  12. func getRoot(w http.ResponseWriter, r *http.Request) {
  13. fmt.Printf("got / request\n")
  14. io.WriteString(w, "This is my website!\n")
  15. }
  16. func getHello(w http.ResponseWriter, r *http.Request) {
  17. fmt.Printf("got /hello request\n")
  18. io.WriteString(w, "Hello, HTTP!\n")
  19. }
  20. func generatePDF(w http.ResponseWriter, r *http.Request) {
  21. var b bytes.Buffer
  22. pw := io.Writer(&b)
  23. pr := io.Reader(&b)
  24. pdf := gofpdf.New("P", "mm", "A4", "")
  25. fontsize := 12.0
  26. font := "Arial"
  27. pdf.SetFont("Arial", "", 6)
  28. pdf.AddPage()
  29. pdf.SetMargins(5, 5, 5)
  30. pdf.SetAutoPageBreak(true, 34)
  31. pdf.SetFont(font, "B", fontsize)
  32. pdf.MultiCell(0, 8, "TERMS OF LIVING", "", "C", false)
  33. pdf.MultiCell(0, 8, "Terms", "", "C", false)
  34. // 在本地主机网页上显示pdf。
  35. err := pdf.Output(pw)
  36. if err != nil {
  37. fmt.Println(err)
  38. return
  39. }
  40. w.Header().Set("Content-Type", "application/pdf")
  41. resPDF, _ := ioutil.ReadAll(pr)
  42. w.Write(resPDF)
  43. fmt.Println("PDF served successfully")
  44. }
  45. func main() {
  46. http.HandleFunc("/", getRoot)
  47. http.HandleFunc("/hello", getHello)
  48. http.HandleFunc("/pdf", generatePDF)
  49. err := http.ListenAndServe(":3333", nil)
  50. if errors.Is(err, http.ErrServerClosed) {
  51. fmt.Printf("server closed\n")
  52. } else if err != nil {
  53. fmt.Printf("error starting server: %s\n", err)
  54. os.Exit(1)
  55. }
  56. }
英文:

By default http package serves the page with Content-type: text/html header. You have to specify the needed header by yourself before writing the page content:

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

However, the sample code you provided does not work, because a mess with io streams. Here is what you need to change:

  1. func generatePDF(w http.ResponseWriter, r *http.Request) {
  2. var b bytes.Buffer
  3. pw := io.Writer(&b)
  4. pr := io.Reader(&b)
  5. ...
  6. err := pdf.Output(pw)
  7. ...
  8. w.Header().Set("Content-Type", "application/pdf")
  9. resPDF, _ := ioutil.ReadAll(pr)
  10. w.Write(resPDF)
  11. fmt.Println("PDF served successfully")
  12. }

I suggest you to have some practice with io library.

Here is the full code that works for me:

  1. package main
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "net/http"
  9. "os"
  10. "github.com/krazybee/gofpdf"
  11. )
  12. func getRoot(w http.ResponseWriter, r *http.Request) {
  13. fmt.Printf("got / request\n")
  14. io.WriteString(w, "This is my website!\n")
  15. }
  16. func getHello(w http.ResponseWriter, r *http.Request) {
  17. fmt.Printf("got /hello request\n")
  18. io.WriteString(w, "Hello, HTTP!\n")
  19. }
  20. func generatePDF(w http.ResponseWriter, r *http.Request) {
  21. var b bytes.Buffer
  22. pw := io.Writer(&b)
  23. pr := io.Reader(&b)
  24. pdf := gofpdf.New("P", "mm", "A4", "")
  25. fontsize := 12.0
  26. font := "Arial"
  27. pdf.SetFont("Arial", "", 6)
  28. pdf.AddPage()
  29. pdf.SetMargins(5, 5, 5)
  30. pdf.SetAutoPageBreak(true, 34)
  31. pdf.SetFont(font, "B", fontsize)
  32. pdf.MultiCell(0, 8, "TERMS OF LIVING", "", "C", false)
  33. pdf.MultiCell(0, 8, "Terms", "", "C", false)
  34. // Show the pdf on localhost web page.
  35. err := pdf.Output(pw)
  36. if err != nil {
  37. fmt.Println(err)
  38. return
  39. }
  40. w.Header().Set("Content-Type", "application/pdf")
  41. resPDF, _ := ioutil.ReadAll(pr)
  42. w.Write(resPDF)
  43. fmt.Println("PDF served successfully")
  44. }
  45. func main() {
  46. http.HandleFunc("/", getRoot)
  47. http.HandleFunc("/hello", getHello)
  48. http.HandleFunc("/pdf", generatePDF)
  49. err := http.ListenAndServe(":3333", nil)
  50. if errors.Is(err, http.ErrServerClosed) {
  51. fmt.Printf("server closed\n")
  52. } else if err != nil {
  53. fmt.Printf("error starting server: %s\n", err)
  54. os.Exit(1)
  55. }
  56. }

huangapple
  • 本文由 发表于 2022年10月10日 23:15:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/74017055.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定