如何在Golang本地localhost网页中展示生成的PDF?
解决方案
你的代码有俩关键问题得先修好,才能让浏览器正确展示生成的PDF:
1. 补全bufWriter的Write方法
你自定义的bufWriter没实现io.Writer接口的Write方法,PDF根本没法写入缓冲区。得加上这个方法:
func (b *bufWriter) Write(p []byte) (int, error) { b.buf = append(b.buf, p...) return len(p), nil }
2. 正确设置响应头并输出PDF
生成PDF后,得告诉浏览器这是个PDF文件,再把缓冲区里的内容输出给响应。把// Show the pdf on localhost web page.后面的代码调整如下:
首先要声明err变量(你原代码没声明,编译会报错),然后设置响应头,最后写入内容。修改后的完整generatePDF函数:
func generatePDF(w http.ResponseWriter, r *http.Request) { pw := new(bufWriter) pdf := gofpdf.New("P", "mm", "A4", "") fontsize := 12.0 font := "Arial" pdf.SetFont("Arial", "", 6) pdf.AddPage() pdf.SetMargins(5, 5, 5) pdf.SetAutoPageBreak(true, 34) pdf.SetFont(font, "B", fontsize) pdf.MultiCell(0, 8, "TERMS OF LIVING", "", "C", false) pdf.MultiCell(0, 8, "Terms", "", "C", false) // Show the pdf on localhost web page. err := pdf.OutputAndClose(pw) // 声明err变量 if err != nil { fmt.Println(err) http.Error(w, "生成PDF失败", http.StatusInternalServerError) // 给客户端返回错误提示 return } // 设置响应头,告诉浏览器这是PDF类型文件 w.Header().Set("Content-Type", "application/pdf") // 让浏览器直接展示PDF而非触发下载(可选,去掉则默认下载) w.Header().Set("Content-Disposition", "inline; filename=terms.pdf") // 设置内容长度,帮助浏览器优化加载 w.Header().Set("Content-Length", fmt.Sprintf("%d", len(pw.buf))) // 将PDF内容写入HTTP响应 _, err = w.Write(pw.buf) if err != nil { fmt.Println("写入PDF响应失败:", err) http.Error(w, "提供PDF失败", http.StatusInternalServerError) return } fmt.Println("PDF已成功提供") }
3. 完整的bufWriter实现
把Write方法放在bufWriter结构体定义的下方(所有函数外部):
type bufWriter struct { buf []byte } func (b *bufWriter) Write(p []byte) (int, error) { b.buf = append(b.buf, p...) return len(p), nil }
改完之后,启动服务器访问http://localhost:3333/pdf,浏览器就会直接渲染生成的PDF。每次修改PDF生成逻辑后,刷新页面就能看到最新效果,实现实时查看。
内容的提问来源于stack exchange,提问作者Ashutosh Yadav
相关产品推荐
相关产品推荐

