2010-08-26 73 views
2

如果給定足夠大的日期範圍,我有一份報告可以生成超過30,000條記錄。從HTML的一面來看,這麼大的結果集並不是問題,因爲我實現了一個分頁系統,在給定的時間將可見結果限制爲100。如何在生成PDF時使用PHP處理極大的字符串

一旦用戶按下「獲取PDF」按鈕,就會出現真正的問題。當發生這種情況時,我基本上重新運行報告中的部分數據(報告本身的結果存儲在'save'表中,因此不需要重新運行數據收集邏輯),並將結果存儲在名爲$html的變量中。請記住,此變量現在包含30,000條數據記錄以及在PDF上正確格式化所需的HTML。一旦我創建了這個HTML字符串,我將它傳遞給TCPDF以嘗試爲用戶生成PDF文件。但是,不會生成PDF文件,它只是在沒有錯誤消息的情況下('生成PDf ...')對話消失,系統就像您從未要求它執行任何操作一樣。

通過測試,我發現問題在於傳入的$html變量的大小。如果3K記錄下的報告,它工作正常。如果結果如此,報告的HTML端將會打印,而不是PDF。

有用的信息

  • PHP 5.3
  • TCPDF生成PDF(也試過PS2PDF)
  • 腳本內存限制:500 MB

如何將你們處理這種規模生成此大小的PDF時的數據?

回答

0

TCPDF似乎是PHP中PDF生成的本地實現。使用編譯的庫如PDFlib或命令行應用程序如htmldoc可能會獲得更好的性能。後者將有最好的機會來生成一個大的PDF。

另外,你打破輸出PDF成多個頁面?即TCPDF是否知道將單個HTML文檔分成多個頁面,或者您是否生成多個HTML文件以便將其合併爲一個PDF文檔?這也可能有所幫助。

+0

我傳入一個巨大的HTML字符串,TCPDF然後分裂成一個多頁PDF。我認爲問題不在於PDF生成器,而在於'$ html'變量的大尺寸。 – 2010-08-26 16:45:12

+0

@Levi Hackwith:這沒有任何意義。 PDF可以像你想要的那樣大。如果PDF生成器在其輸入HTML過大時失敗,那麼這是生成器的問題。否則,只需減少HTML文件的大小並創建許多小型PDF,如shamittomar建議。儘管大多數桌面程序在創建100,000頁以上的PDF時沒有問題。 – 2010-08-26 17:04:42

+0

因此,普遍認爲問題出在TCPDF內,而不是PHP本身? – 2010-08-26 17:47:46

0

我會把PDF分成幾部分,就像分頁一樣。

1)在每個分頁的HTML頁面上都有「Get PDF」按鈕,並且只允許從該HTML頁面下載記錄。

2)限制可以下載的最大記錄數。如果最大限制達到,請拆分PDF並讓用戶下載多個PDF。

1

這是我如何解決這個問題:我注意到一些我在我的HTML輸出具有琴絃有一些輕微的編碼問題 - 我跑ヶ輛在那些特定的字符串當我查詢他們的數據庫並解決了這個問題。

不知道這是什麼原因導致你的問題,但我的經驗非常相似 - 當我試圖輸出一個大型的HTML表格時,大約有80.000行,TCPDF會顯示頁眉但沒有任何表格相關。這種行爲對於不同的數據集合和不同的表格結構是一樣的。

經過多次嘗試,我開始添加我自己的分頁 - 每隔15個表格行,我會打破該頁面並向下一頁添加一個新表格。那時候我注意到,每隔一段時間我都會在很多完整和正確的頁面之間得到空白頁。那時候我意識到這些特定的數據子集必定存在問題,並發現了編碼問題。可能你有類似的東西,TCPDF沒有清楚你的問題是什麼。

1

您是否在使用writeHTML方法?

我通過性能的建議就在這裏:http://www.tcpdf.org/performances.php

它說:「在更小的碎片分裂大的HTML塊;」。

我發現如果我的HTML塊超過20,000個字符,PDF將花費超過2分鐘的時間來生成。

我簡單地將我的html分成塊,併爲每個塊調用writeHTML,並且它得到了顯着改善。現在不會在2分鐘之前生成的文件需要16秒。