2014-04-06 55 views
0
if (file_exists("folder/$unique_id.pdf")) { 
    header('Content-type: application/pdf'); 
    ob_clean(); // Added after reading similar question's answer 
    flush(); // Added after reading similar question's answer 
    readfile("folder/$unique_id.pdf"); 
} else { 
    $html = "PLACING_MY_HTML_CODE_HERE"; 
    $dompdf = new DOMPDF(); 
    $dompdf->load_html($html); 
    $dompdf->set_paper("A4"); 
    $dompdf->render(); 
    $output = $dompdf->output(); 
    file_put_contents("folder/$unique_id.pdf", $output); 

    header('Content-type: application/pdf'); 
    ob_clean(); // Added after reading similar question's answer 
    flush(); // Added after reading similar question's answer 
    readfile("folder/$unique_id.pdf"); 
} 

如果PDF文件不存在,則使用DOMPDF生成PDF文件。生成的文件沒有任何錯誤,並存儲在文件夾內。但有時,而不是讀取生成的文件,它下載一個文件沒有擴展名,主要是名稱「下載」。我試圖打開在文本編輯器中的文件,我看到的符號與某些標題如applicationcontent-type使用PHP讀取生成的PDF文件有時會下載

後來,搜查SO看到this question,並在我的代碼添加ob_cleanflush。但問題仍然存在。

注意:我檢查了使用Adobe閱讀器和谷歌瀏覽器打開存儲在文件夾中的PDF文件。這些文件已完全呈現並正確保存。

編輯

相反readfile我試過header直接重定向到文件中。這沒有問題。

有什麼建議嗎?

+0

嘗試移動'header('Content-type:application/pdf');'在PDF生成之前 –

+0

關於它在下載之前花費多少時間來生成PDF? –

+0

您確定此代碼是否工作,因爲在if條件的第一行中使用的函數應該是** file_exists ** – Vagabond

回答

0

更改其他{}內的代碼這樣:

else { 

$dompdf = new DOMPDF(); 

ob_start();  
$temp_text = "PLACING_MY_HTML_CODE_HERE"; 

echo $temp_text; 

$html = ob_get_contents(); 
ob_end_clean(); 

$dompdf->load_html($html); 
$dompdf->set_paper("A4"); 
$dompdf->render(); 
$output = $dompdf->output(); 
file_put_contents("folder/$unique_id.pdf", $output); 

header('Content-type: application/pdf'); 
ob_clean(); // Added after reading similar question's answer 
flush(); // Added after reading similar question's answer 
readfile("folder/$unique_id.pdf"); 

} 

我用這與MPDF和它的工作。我希望這也能幫助你。讓我知道輸出。

+0

否@Adarsh,仍然是同一個問題。 –

+0

嘗試將header()函數(只是頭函數)移到右括號後面的else塊的第一行。 – Vagabond

+0

不要運氣,Adarsh。 –

1

我建議你改變你的代碼,這一點,看看會發生什麼:

header('Content-type: application/pdf'); 
header('Content-disposition: attachment; filename="'. $unique_id .'.pdf"'); 
if (!file_exists("folder/$unique_id.pdf")) { 
    $html = "PLACING_MY_HTML_CODE_HERE"; 
    $dompdf = new DOMPDF(); 
    $dompdf->load_html($html); 
    $dompdf->set_paper("A4"); 
    $dompdf->render(); 
    $output = $dompdf->output(); 
    file_put_contents("folder/$unique_id.pdf", $output); 
} 
header('Content-Length: ' . filesize("folder/$unique_id.pdf")); 
readfile("folder/$unique_id.pdf"); 

首先,你有很多雙重功能的兩個,如果(像頭()調用在那裏{}和其他{},兩者都有讀取文件等),因此無論如何將它置於條件之外是理智的。

其次,您在下載時缺少文件名和文件大小參數。

此外,您沒有指定是否要強制下載PDF或在瀏覽器中打開它?如果您想強制下載,請將application/pdf更改爲application/octet-stream

最後,這種方式的代碼更容易調試。如果您看到PDF生成的PDF格式不正確,您只需註釋掉所有header()調用,然後查看它在瀏覽器中的作用。如果dompdf吐出某種通知,它可能會導致pdf損壞並且無法讀取。當您註釋掉header()調用時,您將在瀏覽器中看到這些通知。

+0

@Kasipovic:感謝您的建議。 1.我不想強制下載文件。我只想在瀏覽器中打開PDF文件。 2. PDF文件生成正確,並保存在正確的位置。我試着用Adobe Reader和Google Chrome手動打開文件。我沒有看到任何錯誤。 –

+0

您是否嘗試過使用文件名和文件大小的代碼? –

+0

我在更改代碼。讓我這樣做,並告訴你結果。 –