如何有效地存储几乎相同,不可变的可打印文档?

时间:2016-02-24 20:28:29

标签: pdf

在我参与过的几个网络应用程序中,我们已经为表格字母和发票等内容生成并存储了PDF文件。

在每种情况下,都涉及三个要素:

  • 通用模板,其中包含要填写的字段(例如“亲爱的[客户名称],...”和“[item_description] ...”)。这可以是HTML模板,函数等等。
  • 不同的文字 - 客户的名称,发票的项目和金额等
  • 最终输出 - 完整的PDF二进制文件

虽然任何两个字母或发票可能因< 1kb的文本,我们最终为每个文本存储一个单独的,完整的PDF blob。无论是在数据库中还是在文件系统中(an unpleasant choice),这都是浪费空间。

我考虑过只存储不同的文本和模板,并按需生成PDF,但1)生成PDF文件速度慢; 2)旧文档应始终以相同的方式重新打印,而不是因为模板已更新而更改因为他们得救了。

我有什么解决方案吗?我想:

  • 存储模板(可能带有版本控制)
  • 存储一些不同的文字
  • 允许用户在现在或5年后打印,并使其看起来完全相同(是否与PDF无关
  • 最小化存储要求

如何有效地存储几乎相同,不可变的可打印文档?

1 个答案:

答案 0 :(得分:2)

以下讨论了一种可能有用的一般方法,如果您可以复制,模板,增量更新,然后保存和剥离,只保留PDF的增量部分。

稍后可以将其与原始PDF重新组合。

示意图,逐步更新的PDF看起来像。

Incremental Update

如果您有一个共同的原始模板,加上需要应用以生成不同变体的许多不同更新,那么将原始版本存储一次就很有意义,然后只保存输出的增量部分PDF文件。只需将更新的片段附加到原始PDF上,就可以在需要时重新组合这些片段。

使用您首选的编程语言,可以在较低级别轻松实现PDF的增量部分的剥离。

中间PDF(原始PDF +增量更新)的基本结构如下所示:

%PDF-1.3

   %% ** Original document body ****
xref
0 9
0000000000 65535 f 
0000000014 00000 n 
%% ** ...etc **
trailer
<<
  /Root 1 0 R
  /Size 9
>>
startxref
644
%%EOF

  %% ** Updated section ***

xref
0 1
0000000000 65535 f 
3 1
0000000951 00000 n 
9 3
0000000892 00000 n 
0000001024 00000 n 
0000001200 00000 n 
trailer
<<
  % ...
>>
startxref
1324
%%EOF

直至并包含倒数第二个%%EOF的部分是您的原始模板。这是不变部分,应该与原始PDF匹配,只需要存储一次。

更新部分是PDF中倒数第二个%%EOF之后的所有内容,它们是不同的文本,作为增量更新,需要多次存储。

希望您能找到一个合适的工具来执行增量更新,并生成最终的PDF,只附加一个小的更新部分。

另见How to edit PDF files using Incremental Updates