如何在生成PDF时在PHP中处理非常大的字符串

时间:2010-08-26 16:21:13

标签: php pdf-generation tcpdf

如果给出足够大的日期范围,我的报告可以生成超过30,000条记录。从HTML方面来看,这个大的结果集不是问题,因为我实现了一个分页系统,在给定时间将可视结果限制为100。

一旦用户按下“获取PDF”按钮,就会出现我的真正问题。当发生这种情况时,我基本上重新运行打印数据的报告部分(报告本身的结果存储在'save'表中,因此无需重新运行数据 - 收集逻辑),并将结果存储在名为$html的变量中。请记住,此变量现在包含30,000个数据记录以及在PDF上正确格式化所需的HTML。一旦我创建了这个HTML字符串,我就把它传递给TCPDF来尝试为用户生成PDF文件。但是,它不是生成PDF文件,而是在没有错误消息的情况下(“生成PDf ...”)对话框消失,系统就像你从未要求它做任何事情一样。

通过测试,我发现问题在于传入的$html变量的大小。如果3K记录下的报告,它可以正常工作。如果它结束了,报告的HTML端将打印而不是PDF。

有用的信息

  • PHP 5.3
  • 用于PDF生成的TCPDF(也尝试过PS2PDF)
  • 脚本内存限制:500 MB

生成这样大小的PDF时,你们如何处理这种规模的数据呢?

4 个答案:

答案 0 :(得分:1)

以下是我解决这个问题的方法:我注意到我在HTML输出中遇到的一些字符串有一些轻微的编码问题 - 我在查询时对那些特定的字符串运行了 htmlentities 他们的数据库,这清除了问题。

不知道这是不是导致你的问题的原因,但我的经验非常相似 - 当我试图输出一个大尺寸的HTML表格,大约80.000行时,TCPDF会显示页面标题但是没有与表相关的东西。对于不同的数据集和不同的表结构,这种行为是相同的。

经过多次尝试后,我开始添加自己的分页 - 每15个表行,我会打破页面并将新表添加到下一页。就在那时,我注意到每隔一段时间我会在很多完整和正确的页面之间得到空白页。那时我意识到这些特定的数据子集一定存在问题,并发现了编码问题。可能是你有类似的东西,TCPDF没有说清楚你的问题是什么。

答案 1 :(得分:1)

您使用的是writeHTML方法吗?

我在这里查看了效果建议:http://www.tcpdf.org/performances.php

它说“将较大的HTML块拆分成较小的块;”。

我发现,如果我的HTML块超过20,000个字符,PDF将花费2到2分钟来生成。

我只是将我的html拆分为块,并为每个块调用writeHTML,并且它得到了显着改善。之前2分钟内无法生成的文件需要16秒。

答案 2 :(得分:0)

我会将PDF分成几部分,就像分页一样。

1)在每个分页的HTML页面上都有“获取PDF”按钮,并且只允许从该HTML页面下载记录。

2)限制可下载的最大记录数。如果达到最大限制,请拆分PDF并让用户下载多个PDF。

答案 3 :(得分:0)

TCPDF似乎是PHP中PDF生成的本机实现。使用像PDFlib这样的编译库或像htmldoc这样的命令行应用程序可能会有更好的性能。后者将有最好的机会生成大型PDF。

另外,您是否将输出PDF分成多个页面?即TCPDF是否知道将单个HTML文档剪切成多个页面,或者您是否生成多个HTML文件以将其合并为一个PDF文档?这也可能有所帮助。