2017-11-11 110 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組工作,爲什麼我知道肯定有一些庫會這樣做。 :)

相關問題