2017-11-11 152 views
0

我们想要将很多PDF文件合并成一个大文件并发送给客户端。但是,我们的生产服务器上的资源非常有限,因此首先合并内存中的所有文件,然后发送完成的PDF文件会导致脚本被终止,因为它耗尽了可用内存。即时创建PDF文件并在尚未完成时进行流式传输?

唯一的解决方案(除了获得更好的服务器,显然)将开始流PDF文件,完全创建之前,绕过内存限制。

但是我想知道这是否可能。 PDF文件在完全创建之前是否可以流式传输?或者PDF文件格式不允许流式传输未完成的文件,因为在完整内容确定之后必须设置一些标题或任何内容?

如果可能,哪个PDF库支持将文件创建为流?大多数我知道的库(比如TCPDF)似乎都在内存中创建了完整的文件,然后最终在某个地方输出完成的结果(即通过$tcpdf->Output()方法)。

回答

0

PDF文件格式完全可以流式传输。无论如何没有任何东西会阻止它。

作为一个例子,我们最近有一位客户需要通过HTTP连接阅读单个页面到远程PDF,而无需下载或阅读整个PDF。我们可以通过为PDF中的特定内容提供很多小型HTTP请求来完成此操作。我们使用PDF末尾的预告片和交叉参考表来查找所需的内容,而无需解析整个PDF。

如果我理解你的问题,它看起来像你正在使用的当前库在创建或流出合并文档之前加载内存中的每个PDF。

如果我们以不同的方式来看待这个问题,更好的解决方案是让PDF库仅引用要合并的PDF,然后当合并的PDF正在创建或流式传输时,拉入内容并根据需要合并PDF文件中的资源。

我不确定有多少PHP库可以做到这一点,因为我并不是最新的PHP,但我知道可能有一些C/C++库可能能够做这个。我知道PHP可以使用扩展来调用这些库。唯一的缺点是他们可能会有商业许可证。

声明:我为Mako SDK R & D组工作,为什么我知道肯定有一些库会这样做。 :)

相关问题