在飞行中创建一个PDF文件并在尚未完成时进行流式传输



我们想将许多PDF文件合并为一个大文件并发送到客户端。然而,我们的生产服务器上的资源非常有限,因此首先合并内存中的所有文件,然后发送完成的PDF文件会导致我们的脚本被杀死,因为它耗尽了可用内存。

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

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

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

PDF文件格式完全可以流式传输。无论如何,肯定没有什么能阻止它。

例如,我们最近有一位客户要求通过HTTP连接到远程PDF读取单个页面,而无需下载或读取整个PDF。我们可以通过对PDF中的特定内容进行许多小型HTTP请求来实现这一点。我们使用PDF末尾的尾部和交叉引用表来查找所需内容,而无需解析整个PDF。

如果我理解您的问题,那么在创建或流式输出合并文档之前,您当前使用的库似乎会将每个PDF加载到内存中。

如果我们用不同的方式看待这个问题,更好的解决方案是PDF库只引用要合并的PDF,然后在创建或流式传输合并的PDF时,根据需要从要合并的PDF中提取内容和资源。

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

免责声明:我为Mako SDK R&D组,因此我确信有一些库可以做到这一点。:)

最新更新