【问题标题】:How to make pdf file by reading content from database using beego?如何通过使用beego从数据库中读取内容来制作pdf文件?
【发布时间】:2015-03-05 01:05:21
【问题描述】:

我阅读了一个 pdf 文件,然后将其原始内容存储到数据库中。现在我想从数据库中读取该内容并创建一个 pdf 以便用户可以下载它。

为此,我阅读了内容并将其写入扩展名为 .pdf 的文件。但结果是一个空的pdf文件。

我这样做是因为我想避免将文件保存在磁盘中。

我正在使用beego框架。

有什么建议/帮助吗?

我在做什么

从pdf文件读取并写入数据库

_,header,_:=c.GetFile("attachment[]")
attachment:=header.Filename
c.SaveToFile("attachment[]","/tmp/"+attachment)
content,_:= ioutil.ReadFile("/tmp/"+attachment)
s := string(content)

然后将这个's'写入数据库

从数据库读取并写入pdf文件

err := o.Raw("SELECT attachment FROM table_name WHERE id=?",id).QueryRow(&att)
if err == nil {
     fmt.Println(att)
}
var data []byte
data = []byte(att)
ioutil.WriteFile("/tmp/hello.pdf",data, 0666)

【问题讨论】:

  • 永远不要忽略错误!! GetFile 忽略了什么? SaveToFile 是否返回错误?您忽略 ioutil.ReadFile 错误。您忽略 ioutil.WriteFile 错误。在这里使用文件是错误的。

标签: database pdf go beego


【解决方案1】:

您忽略了来自GetFile 调用的multipart.File。直接用那个。将其写入磁盘并再次读取它是浪费时间。

在从数据库读取文件和发送到客户端之间,也没有理由将文件保存到磁盘。

(您可能希望确保您的数据库经过优化以处理此类大型 blob。这不是大多数数据库的常见用例。)

【讨论】:

  • 感谢您的回答。我明白你在数据库中存储文件存在性能问题。但我的问题是如何制作 pdf 文件并在从 db 读取内容后下载它。关于如何做的任何帮助?
  • 数据库跑题了。如果您只是将数据发送到其他地方,则没有理由编写文件。
  • @JimB 你最后的评论没用。是什么让您有权为 OP 做出决定。他问了一个合理的问题,并且需要它。提出建议即可,然后回答问题。
  • @DonaldFrench:我确实回答了这个问题(尽管 4 年前,来自 OP 的信息有限)。问题是忽略了包含文件的multipart.File,这就是为什么它与数据库无关而其余的不起作用。其他一切都只是你所说的建议。
【解决方案2】:

我在 MongoDB 文档中遇到了同样的 pdf 问题。它被存储为 Base64 加密的字符串值。我的步骤是:

  1. 查找记录。
  2. 解码字符串:
  3. 从 pdfBytes 创建一个 *Buffer
  4. 直接写到http.ResponseWritter:

    b := bytes.NewBuffer(pdfBytes) // Step 2 pdfBytes,err := b64.StdEncoding.DecodeString(doc.Image) // Step 3 if _, err := b.WriteTo(w); err != nil { // Step 4 fmt.Fprintf(w, "%s", err) // Handle the error }

这很好用,我使用它处理了 40+ 百万个文档。但是,如果有更好的方法,我总是有兴趣学习。正如@JimB 所说,如果您需要从文件中读取,他的方式是最好的。问题是问题非常模糊。

【讨论】:

    【解决方案3】:

    什么时候使用 github.com/jung-kurt/gofpdf 库:

    func (c *MyController) PrintPDF() {         
        pdf := gofpdf.New("", "", "", "")
        pdf.AddPage()
        pdf.Text(10, 20, "Circles")
        var b bytes.Buffer
        w := bufio.NewWriter(&b)
        pdf.Output(w)
        pdf.Close()
        w.Flush()
        c.Ctx.Output.ContentType("application/pdf")
        c.Ctx.Output.Body(b.bytes())
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 2023-04-02
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2013-02-24
      • 2018-02-19
      • 1970-01-01
      相关资源
      最近更新 更多