使用pdftk在PHP中批量生成基于模板的pdf


Bulk template based pdf generation in PHP using pdftk

我正在基于模板批量生成pdf文件,很快就遇到了大的性能问题。我目前的情况如下:

  1. 从数据库获取要填充的数据
  2. 基于单数据行和pdf表单创建fdf
  3. .fdf文件写入磁盘
  4. 使用pdftk将pdf与fdf合并(fill_form with flatten命令)
  5. 继续在行上迭代,直到生成所有.pdf
  6. 最后,所有生成的文件都会合并在一起,并将单个pdf提供给客户端

我使用passthru向客户端提供原始输出(节省了编写文件的时间),但这只是一点性能改进。200张唱片的总操作时间约为50秒,我希望以某种方式减少到至少10秒。

理想的情况是在内存中操作所有这些pdf,而不是将它们中的每一个都写入单独的文件,但输出将不可能完成,因为我无法将这种数据传递给像pdftk这样的外部工具。另一个想法是用所有这些行生成一个大的.fdf文件,但看起来这是不允许的。

我是不是错过了一些琐碎的事情?

我很感谢你的建议。

PS。我知道我可以使用一些像pdflib这样的好库,但我现在只考虑开放授权库。

编辑:

我正试图找出语法,用同一个pdf作为模板构建一个包含多个页面的.fdf文件,花了几个小时,却找不到任何好的文档。

在长期面临同样的问题(想基于LaTeX生成我的PDF)后,我最终决定改用另一种粗糙但有效的技术:

我通过两个步骤生成我的pdf:首先,我用一个模板引擎生成html,比如trick或smarty。第二,我使用mpdf来生成pdf。我尝试了许多其他的html2pdf框架,最终使用了mpdf,它非常成熟,而且开发时间很长(频繁更新,功能丰富)。使用这种技术的好处是:您可以使用css来设计文档(mpdf完全具有css的特性),这与css的好处一起提供(http://www.csszengarden.com)并且生成动态表非常容易。

Mpdf解析html表,并查找theader,tfooter元素,如果表大于一个页面大小,则将其放在每个页面上。此外,您还可以使用动态实体(如页码)定义页眉和页脚元素。

我知道,使用这种迂回方式似乎是一种变通方法,但老实说,没有latex,pdf任何引擎都像html一样强大和简单!

尝试不同的不太复杂的库,如fpdf(http://www.fpdf.org/)

我觉得它很好,很轻。

总是找到小的库,并且只做你需要它们做的事情。

图书馆越大,消耗的资源就越多。

这对多页问题没有帮助,但我注意到pdftk接受-字符表示"从标准输入读取"。

您可以通过pdftk进程的stdin将.fdf发送到它,以避免将它们写入磁盘。