我应该动态重新创建 PDF,而不是将其存储在数据库或文件系统中吗?

Posted

技术标签:

【中文标题】我应该动态重新创建 PDF,而不是将其存储在数据库或文件系统中吗?【英文标题】:Should I dynamically recreate a PDF, rather than store it in either the database or the filesystem? 【发布时间】:2008-10-22 22:16:38 【问题描述】:

我需要客户能够下载已发送给他们的信件的 PDF。

我已经阅读了有关文档或图像的数据库与文件系统存储的线程,听起来确实是这样的共识是,对于不仅仅是几个图像,文件系统是要走的路。

我想知道的:

一个合理的替代方案是将信件详细信息存储在数据库中,并在请求时“即时”重新创建 PDF? 与从文件系统中获取 PDF 相比,这种方法是优还是劣?

【问题讨论】:

【参考方案1】:

如果是出于存档目的,我肯定会存储 PDF,因为将来,您的 PDF 生成脚本可能会更改,然后这封信将与最初发送的不完全相同。客户会期望它完全一样。

不管哪种方法更好,有时最好选择哪种方法更安全。

【讨论】:

我所做的一切都需要存档方法。我们实际上在表中添加了一个触发器,以便在插入或更新记录时生成一个新的 PDF。【参考方案2】:

我会出于两个原因将其存储起来

1) 如果您更改了生成 PDF 的方式,您可能不希望更改历史项目。如果你每次都生成它们,要么它们会改变,要么你需要保留兼容性代码来生成“旧式”记录

2) 磁盘空间便宜。用户的耐心不是。除非您真的迫切需要存储或提取存储比生成 PDF 更难,否则请善待您的用户并将其存储。

显然,如果您从稀疏数据集每小时创建数千个这样的数据,您可能没有存储空间。但如果你有空间,我会投票支持“使用它”

【讨论】:

【参考方案3】:

您必须保留发送给客户的信件记录是否有取证原因?如果您要即时重新生成,您怎么知道未来的代码更改不会重写这封信(或者,如果该信息用于诉讼,至少客户可以在法庭上提出该论点)......

【讨论】:

【参考方案4】:

我倾向于说“这取决于”。

当一个文档被多次请求时,如果您在第一次请求时编写它并随后检索它,可能会节省很多。

OTOH 如果对文档的大多数请求都是一次性类型的,并且创建过程不会占用您的大部分服务器容量,那么动态将具有明显的优势。

【讨论】:

【参考方案5】:

如果您使用的是 ASP.NET,为什么不缓存 PDF。如果您愿意,您的缓存可以存储在数据库中,或者只要您首先需要它就可以保留在内存中。 enterprise library 在缓存应用程序块中为您实现了这一点,并且使用起来非常简单。如果你缓存对象,使用块在数据库中创建一个存储,然后在需要时加载它,你不必担心重新创建它。

【讨论】:

【参考方案6】:

需要考虑的一点是,PDF 是基于某个时间点存在的数据生成的。例如。基于上个月数据的账单?

如果是这样,您会每个月使用相同的模板来生成这封信吗? 如果/当字母格式发生变化时会发生什么,如果您即时重新生成它不再是发送给他们的相同。 是否可以将 PDF 流存储到数据库中?

我猜我在说什么,您是否需要准确表示发送给用户的内容,还是那样灵活?

【讨论】:

我的建议是将所有信件信息从最初创建之日起保存在自己的表格中。所以段落文本和客户数据不会改变。我是否通过即时方法获得(或失去)任何东西? 例如,这种方法本质上是否比将现有的 PDF 放在某个驱动器上更安全(或更低)? 无论多少安全,PDF 都可以重新生成并放入目录中,就像编辑数据一样简单。两者都不太可能发生,但有可能发生。基于文件的方法的问题在于它们的实际管理。即时生成可以避免这种情况。 但是缺点是如果/当模板更改时,这可能是好事也可能是坏事。如果您有一个新的标头图形,那么企业可能希望它适用于所有信件,而不仅仅是新信件。这是一个艰难的决定,需要您和企业之间做出决定。【参考方案7】:

是动态生成 pdf 文件还是静态存储它们的问题听起来更像是一个法律问题而不是编程问题。

如果您无法获得可以为此提供指导的法律顾问,那么谨慎行事并静态存储它们会更安全。

【讨论】:

【参考方案8】:

只要 PDF 文档是永久性的(不仅仅是工作文档,而是正式签署并发送到公司其他地方或公司外部的文件),您就应该拥有一份您网络上的此 PDF 文件,以及您数据库中此文件的链接。

您不能依靠可用数据在不同时间复制相同的文档,主要是因为:

    数据可以更改(是的!假设这封信已确定由部门负责人签名,并且人员已更改?) 您的报告格式将发生变化(页眉、页脚、徽标等) 您制作的文档由将使用文档中可用数据的其他人保存。

【讨论】:

以上是关于我应该动态重新创建 PDF,而不是将其存储在数据库或文件系统中吗?的主要内容,如果未能解决你的问题,请参考以下文章

您可以使用流而不是本地文件上传到 S3 吗?

我应该在哪里存储我的应用程序数据?

用于创建动态数据并将其添加到 PDF 的开源 API

我已经从 html 创建了 pdf 现在我想将此 pdf 上传到 cloudinary 或我们的服务器而不将其保存到客户端 PC

如何将 json 数据与 Angular 材质表绑定以创建动态表?

使用 HTML jQuery 和 Java 在 mySQL DB 中存储 PDF