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

时间:2012-08-29 09:33:14

标签: php pdf pdf-generation pdftk fdf

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

  1. 从db
  2. 获取数据
  3. 基于单个数据行和pdf格式创建fdf
  4. .fdf文件写入磁盘
  5. 使用pdftk(fill_form with flatten命令)将pdf与fdf合并
  6. 继续迭代行,直到生成所有.pdf
  7. 最终将所有生成的文件合并在一起,并将单个pdf提供给客户端
  8. 我使用passthru将原始输出提供给客户端(节省编写文件的时间),但这只是一点性能改进。对于200条记录,总操作时间约为50秒,我想以某种方式降低至少10秒。

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

    我在这里遗漏了一些非常微不足道的东西吗?

    我很感谢你的任何建议。

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

    修改

    我要弄清楚使用相同的pdf作为模板构建具有多个页面的.fdf文件的语法,花费几个小时并且找不到任何好的文档。

3 个答案:

答案 0 :(得分:1)

在长期面对同样的问题之后(想要基于LaTeX生成我的pdf)我终于决定转向另一种粗略但有效的技术:

我分两步生成我的pdf:首先我使用twig或smarty等模板引擎生成html。第二,我使用mpdf生成pdfs。我尝试了很多其他的html2pdf框架并最终使用了mpdf,它非常成熟并且很久以来一直在开发(频繁更新,功能丰富)。使用这种技术的好处:你可以使用css来设计你的文档(mpdf完全具有css功能) - 它带有css好处(http://www.csszengarden.com)并且非常容易生成动态表。

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

我知道,使用这种绕道似乎是一种解决方法,但说实话,没有乳胶,pdf无论什么引擎都像html一样强大和简单!

答案 1 :(得分:0)

尝试使用其他不太复杂的库,例如fpdf(http://www.fpdf.org/

我发现它非常好而精简。

始终找到较小的图书馆,只做您需要做的事情。

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

答案 2 :(得分:0)

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

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