我正在基于模板批量生成pdf文件,很快就遇到了大的性能问题。我目前的情况如下:
- 从数据库获取要填充的数据
- 基于单数据行和pdf表单创建fdf
- 将
.fdf
文件写入磁盘 - 使用pdftk将pdf与fdf合并(fill_form with flatten命令)
- 继续在行上迭代,直到生成所有
.pdf
- 最后,所有生成的文件都会合并在一起,并将单个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
发送到它,以避免将它们写入磁盘。