【问题标题】:Bulk template based pdf generation in PHP using pdftk使用 pdftk 在 PHP 中基于批量模板生成 pdf
【发布时间】:2012-08-23 21:08:02
【问题描述】:

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

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

我使用passthru 将原始输出提供给客户端(节省写入文件的时间),但这只是一点性能改进。 200 条记录的总操作时间约为 50 秒,我想以某种方式缩短到至少 10 秒。

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

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

感谢您的任何建议。

PS。我知道我可以使用一些好的库,比如 pdflib,但我现在只考虑开放许可库。

编辑:

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

【问题讨论】:

  • 你能不能用一些像 xdebug 这样的分析工具和 webgrind 看看什么事情实际上需要时间(然后你可以解决这个问题),几天前我遇到了同样的情况,正在使用 open源排队系统在我的情况下需要时间。我使用的是 dompdf,它又是开源解决方案。
  • 我进行了分析,主要是花费大量时间编写单独的 pdf 文件。
  • 为什么不并行运行 6 或 7 次 pdftk 转换,这样可以将您的总时间降至 10 秒的阈值。

标签: php pdf pdf-generation pdftk fdf


【解决方案1】:

在面对同样的问题很长时间(想基于 LaTeX 生成我的 pdf)后,我终于决定改用另一种粗略但有效的技术:

我分两步生成我的 pdf:首先我使用 twig 或 smarty 之类的模板引擎生成 html。其次,我使用mpdf 从中生成pdf。我尝试了许多其他 html2pdf 框架并最终使用了 mpdf,它非常成熟并且开发了很长时间(频繁更新,功能丰富)。使用这种技术的好处:您可以使用 css 来设计您的文档(mpdf 完全包含 css)——这与 css 的好处 (http://www.csszengarden.com) 相伴而生,并且非常容易生成动态表格。

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

我知道,使用这个弯路似乎是一种解决方法,但老实说,没有乳胶,pdf 任何引擎都像 html 一样强大和简单!

【讨论】:

    【解决方案2】:

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

    我觉得它很好而且很精简。

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

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

    【讨论】:

    • 是的,我已经看到并使用了这些库(fpdf、tcpdf、dompdf),但它们并没有做我需要做的事情。我必须基于一个 PDF 模板生成一个大 PDF 并用数据填充它。这些库都没有这样做。它们适用于从头开始创建自己的 pdf,但不适用于模板。
    • 那么你应该考虑在不同的 PHP 调用中一个一个地生成它们,以确保每次生成后都会清除内存。确保即使在生成时也清除任何大变量。甚至可能是非 PHP 解决方案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 2011-10-17
      • 1970-01-01
      • 2016-02-01
      • 2010-09-10
      • 2019-01-15
      • 2013-09-16
      • 2022-06-15
      • 2012-01-16
      相关资源
      最近更新 更多