2014-04-06 56 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

我在更改代码。让我这样做,并告诉你结果。 –