使用 Zend_PDF 合并大量 PDF 时出现内存不足错误

发布于 2025-01-02 01:12:22 字数 590 浏览 0 评论 0原文

我们使用 SugarCRM 中的 Zend_PDF 模块来合并我们系统生成的 pdf 发票。我已经能够成功合并多个 PDF(在我的测试中大约 10 到 30 个),但是当我们尝试合并大量 pdf 文件时,我们会遇到内存错误。该错误看起来像这样:

[30-Jan-2012 14:10:20] PHP 致命错误:允许的内存大小为 268435456 字节,在 /usr/local/src/php-5.3.8/Zend/zend_operators.c:1265 处耗尽(尝试分配 68134 字节) /srv/www/htdocs/sugar6_mf/Zend/Pdf/Element/Object/Stream.php 第 442 行

当我们尝试合并 457 个 pdf 文件时,会生成上述错误 - 这是文件,而不是页面。我们最终需要一次合并 5,000 甚至更多。

任何人都可以提供有关如何解决此问题的任何帮助/建议吗?

如果需要,请询问,我将发布有关如何生成合并的 pdf 的代码。

谢谢。

We're using the Zend_PDF module in SugarCRM to merge pdf invoices that our system generates. I have been able to successfully merge a number of PDFs (around 10 to 30 in my tests), but we're getting memory errors when we try to merge larger numbers of pdf files. The error looks something like this:

[30-Jan-2012 14:10:20] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted at /usr/local/src/php-5.3.8/Zend/zend_operators.c:1265 (tried to allocate 68134 bytes) in /srv/www/htdocs/sugar6_mf/Zend/Pdf/Element/Object/Stream.php on line 442

The above error was generated when we tried to merge 457 pdf files - that's files, not pages. We're going to need to merge 5,000 and more at a time eventually.

Can anyone offer any help/advice on how to address this?

If needed, ask, and I'll post the code on how the merged pdf is being generated.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雨夜星沙 2025-01-09 01:12:22

在回答这个问题之前,我应该说我对 SugarCRM 一无所知 - 我的回答完全基于我对 Zend_Pdf 的了解。

如果我的理解是正确的,您有一个 PHP 脚本(考虑到处理 5,000 个文件所需的时间长度,希望不要在 Apache 中运行),该脚本使用 将多个 PDF 文件作为输入Zend_Pdf::load() 方法,然后迭代每个 PDF 对象的页面并将它们添加到 Zend_Pdf 的一个目标实例中,然后使用save() 方法。

使用这种方法,即使在将页面添加到目标 PDF 对象后unset()每个源 PDF 对象,您仍然需要足够的内存来存储整个输出文件。如果您仅使用 457 个文件就消耗了 250MB,那么我猜测您的输入 PDF 文件可能约为 500KB,因此您的输出文件将绝对巨大,因此您最终仍然会耗尽内存。

我的建议是完全放弃此方法并使用 pdftk 代替,您可以使用 exec() 函数调用它。我确信您可以提供给 exec() 的参数大小是有限的,因此这可能是一个包含多个中间文件的多步骤过程,但最终我认为这将是更快、更强大的解决方案。

重申一下之前的观点,我不会在 Apache 中运行此过程。我将设置一个以适当的时间间隔运行的 cron 作业,并将输出文件放入 Web/文件服务器上的安全区域。

I should preface this answer by saying that I know nothing about SugarCRM - my response is based solely on my knowledge of Zend_Pdf.

If my understanding is correct, you have a PHP script (hopefully not running inside Apache considering the length of time it will take to process 5,000 files) that is taking multiple PDF files as input using the Zend_Pdf::load() method and then iterating through the pages of each PDF object and adding them to one target instance of Zend_Pdf, which you are then writing to a file using the save() method.

Using this approach, even if you unset() each of the source PDF objects after you've added the pages to the target PDF object, you'll still need enough memory to store the entire output file. If you blew through 250MB with only 457 files, then I'm guessing your input PDF files are probably about 500KB, so your output file is going to be absolutely huge, so you are still going to end up running out of memory.

My advice would be to ditch this method entirely and use pdftk instead, which you could invoke using the exec() function. I'm sure there's a limit to the size of the arguments you can provide to exec(), so it will probably be a multi-step process with several intermediate files, but ultimately I think this will be a faster, more robust solution.

And just to re-iterate an earlier point, I would not run this process within Apache. I would set up a cron job that runs at the appropriate intervals and drops the output file into a secure area on your web/file server.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文