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

7
我正在根据模板批量生成PDF文件,但很快遇到了大量性能问题。 目前的情况是这样的:
  1. 从数据库中获取要填充的数据
  2. 基于单个数据行和PDF表单创建fdf
  3. 将 `fdf` 文件写入磁盘
  4. 使用pdftk(使用flatten命令填充表格)将pdf与fdf合并
  5. 继续迭代所有行,直到生成所有PDF文件
  6. 最后将所有生成的文件合并在一起,并将单个pdf提供给客户端
我使用 `passthru` 将原始输出返回给客户端(节省写文件时间),但这只是一点点性能优化。总操作时间约为50秒,生成200条记录,我希望用某种方法将其降至至少10秒。
理想情况是在内存中操作所有这些PDF,而不是将每一个单独的PDF都写入分别的文件中,但那样的输出方式无法传递给外部工具如pdftk。
另一个想法是使用包含所有行的一个大型 `fdf` 文件,但看起来不被允许。
我是否漏掉了什么非常琐碎的东西?
感谢任何建议。
PS. 我知道我可以使用像pdflib这样的好库,但现在我只考虑使用开放许可证的库。
编辑: 我正在尝试找出使用相同PDF作为模板构建具有多个页面的 `fdf` 文件的语法,花了几个小时,找不到任何好的文档。

你可以使用一些性能分析工具,如xdebug和webgrind,查看哪些部分实际上需要时间(然后你就可以解决这个问题)。我几天前也遇到了同样的情况,当时我正在使用一个开源队列系统,它在我的情况下需要花费很长时间。我还在使用dompdf,这也是一个开源解决方案。 - amitchhajer
我进行了分析,主要花费大量时间的是反复编写单独的PDF文档。 - Naz
为什么不并行运行6或7个pdftk转换,这样可以将总时间缩短到您的10秒阈值以下。 - Bryan Waters
3个回答

1

在长时间面对同一个问题(想要基于LaTeX生成我的pdf)后,我最终决定转换到另一种简单但有效的技术:

我将生成pdf分为两步:首先使用模板引擎(如twig或smarty)生成html。然后使用mpdf将其转换为pdf。我尝试了许多其他的html2pdf框架,最终选择了mpdf,它非常成熟,并且已经开发了很长时间(频繁更新,功能丰富)。使用这种技术的好处是:您可以使用css来设计文档(mpdf完全支持css),这与css的优势(http://www.csszengarden.com)相伴而来,并且可以轻松生成动态表格。

Mpdf解析html表格并查找theader、tfooter元素,如果您的表格大于一页大小,则将其放置在每个页面上。此外,您还可以定义页面标题和页脚元素,包括页面编号等动态实体。

我知道,使用这种绕路似乎是一种解决方法,但说实话,没有任何一个LaTeX、PDF引擎能像HTML那样强大而简单!


0

尝试使用像fpdf(http://www.fpdf.org/)这样的不那么复杂的库。

我发现它相当好且轻量级。

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

库越大,消耗的资源就越多。


是的,我见过并使用过那些库(fpdf、tcpdf、dompdf),但它们不能满足我的需求。我需要基于一个PDF模板生成一个大型PDF,并用数据填充它。这些库都做不到这一点。它们适用于从头开始创建自己的PDF,但不适用于模板化。 - Naz
然后,您应该考虑通过不同的PHP调用逐个生成它们,以确保在每次生成后清除内存。确保即使在生成过程中,您也清除任何大型变量。甚至可以考虑非PHP解决方案。 - transilvlad

0

这并不能解决你的多页问题,但我注意到pdftk接受“-”字符表示“从标准输入读取”。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接