2014-04-06 6 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 파일이 생성됩니다. 파일은 오류없이 생성되어 폴더 내에 저장됩니다. 그러나 가끔 인 경우 생성 된 파일을 읽는 대신 확장자가없고 주로 '다운로드'라는 이름의 파일을 다운로드합니다. 나는 텍스트 편집기에서 파일을 여는 시도하고, 나는 그런 application 같은 일부 헤더, content-type생성 된 PDF 파일을 PHP로 읽기 때때로

나중에, SO에서 검색 및 this question보고와 기호를 보려면, 내 코드에서 ob_clean, flush을 추가했다. 그러나 여전히 문제는 지속됩니다.

참고 : Adobe Reader 및 Google 크롬을 사용하여 폴더에 저장된 PDF 파일을 열어 확인했습니다. 파일이 완전히 렌더링되고 제대로 저장되었습니다.

편집 : 나는 header 파일에 직접 재 시도

대신 readfile의. 그리고이 문제는 없습니다.

제안 사항?

+0

'header ('Content-type : application/pdf');'를 PDF 생성 전에 –

+0

으로 이동하여 다운로드하기 전에 PDF 생성에 소비하는 시간을 알아 봅니다. –

+0

if-conditional의 첫 번째 줄에 사용 된 함수가 ** 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"); 

첫째, 당신은} {이중 기능의 많은 모두있는 경우 (헤더와 같은()가에서 호출했다 else {}, 양쪽 모두의 readfile 등) 어쨌든 실행되기 때문에 조건 바깥에 넣는 것이 정상입니다.

둘째, 다운로드시 파일 이름과 파일 크기 매개 변수가 누락되었습니다.

또한 PDF를 강제로 다운로드하거나 브라우저에서 열 것인지를 지정하지 않았습니까? 강제로 다운로드하려면 application/pdfapplication/octet-stream으로 변경하십시오.

마지막으로이 방법으로 코드를 디버그하는 것이 더 쉽습니다. certaing PDF 세대가 잘못된 PDF를 제공하는 것을 본다면, header() 전화를 모두 주석으로 처리하고 브라우저에서 제공하는 내용을 확인하기 만하면됩니다. dompdf가 어떤 종류의주의를 뱉어 내면 pdf가 손상되어 읽을 수 없게됩니다. header() 전화를 주석 처리하면 해당 공지 사항이 브라우저에 표시됩니다.

+0

@ 카시포비크 : 제안 해 주셔서 감사합니다. 1. 강제로 파일을 다운로드하고 싶지 않습니다. PDF 파일을 브라우저에서 열고 싶습니다. 2. PDF 파일이 올바르게 생성되어 해당 위치에 올바르게 저장됩니다. Adobe Reader와 Google 크롬을 사용하여 파일을 수동으로 열어 보았습니다. 거기에 어떤 오류도 보지 못했습니다. –

+0

파일 이름과 파일 크기로 코드를 사용해 보셨습니까? –

+0

코드를 변경하려고합니다. 내가 그렇게하고 결과를 말해 보자. –

관련 문제