2017-03-27 4 views
0

나는 데이터베이스를 검사하고 계정 시작 날짜가 특정 날짜 인 고객의 각 행을 반환하는 스크립트를 작성 중입니다. 고객이 지정된 날짜에 작성된 경우 고객 행이 내 기능으로 전달되어 데이터베이스의 고객 정보에서 PDF를 작성합니다.dompdf로 여러 PDF 파일 만들기

문제

I 각 고객이 데이터를 통해 루프입니다에 대해 하나의 PDF를 작성하고 PDF를 만들 수까지 생각하는 유일한 방법. 그렇게 할 때 나는 한 가지 문제가있다.

첫 번째 사용자의 PDF 만 작성됩니다. 두 번째와 관련된 일은 발생하지 않습니다.

Unable to stream PDF: headers already sent

브라우저 및 첫 번째 PDF 다운로드에 표시됩니다. 그러나 테스트 목적으로 데이터베이스에 두 개의 고객을 만들어야합니다. 브라우저에 데이터를 표시하고 두 고객이 모두 표시됩니다. 그래서 데이터가 존재하며 런타임에 존재한다는 것을 알고 있습니다.

// create instance of customer's that need to be created 
    $a = new SelectTempOne; 
    // obtain response from customers in database that have met timing requirement 
    $response = $a->selectUserForOne(); 
     // loop through each row in the results and handle then pass to the pdf creation string 
    foreach($response as $i => $row) { 
    // statically typing template string to render email address of user 
    $temp1 = ' 
     <!DOCTYPE html> 
    <html> 

    <head> 
     <title>Template 1</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <link rel="stylesheet" type="text/css" media="screen" href="pdf-templates/temp1/temp1.css" /> 
    </head> 

    <body> 
     <div id="pdf_header"> 
      <table> 
       <tr> 
        <td>'.$response[$i]['email'].'</td> 
       </tr> 
      </table> 
     </div> 
    </body> 

    </html> 
    '; 

    // pass html to dompdf object 
    $dompdf->loadHtml($temp1); 

    // set option for the paper size and orientation 
    $dompdf->setPaper('A4', 'letter'); 

    // Render the HTML as PDF 
    $dompdf->render(); 

    //save the file to the server 
    $output = $dompdf->output(); 
    file_put_contents('pdf/'.$response[$i]['email'].'.pdf', $output); 


    // Output the generated PDF to Browser 
    $dompdf->stream(); 
    exit; 
    } // end of the for loop 
    ?> 

내가 고객의 이메일을 추가 할 경우이 줄은,

<td>'.$response[$i]['email'].'</td> 

상담자를 만들 수 있도록 할 필요가 무엇

데이터베이스에서 반환 된 행을 반복하면서 PDF의 동적 양을?

* UPDATE *

Fatal error: Uncaught Dompdf\Exception: No block-level parent found. Not good. in /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/Positioner/Inline.php:45 Stack trace: #0 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameDecorator/AbstractFrameDecorator.php(872): Dompdf\Positioner\Inline->position(Object(Dompdf\FrameDecorator\Inline))

1 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameReflower/Inline.php(51):

Dompdf\FrameDecorator\AbstractFrameDecorator->position() #2 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameDecorator/AbstractFrameDecorator.php(893): Dompdf\FrameReflower\Inline->reflow(NULL) #3 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameReflower/Page.php(141): Dompdf\FrameDecorator\AbstractFrameDecorator->reflow() #4 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameDecorator/AbstractFrameDecorator.php(893): Dompdf\FrameReflower\Page->reflow(NULL) #5 /Users/wuno/Dropbox/google/devop in /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/Positioner/Inline.php on line 45

답변

1

웹 브라우저가 문서를 요청하여 작동합니다. 사용자에게 여러 문서를 제공 할 수는 없습니다. 한 번 $dompdf->stream();에 전화하면됩니다. 옵션 : 개별 링크가있는 목록 페이지를 동적으로 생성하거나, 여러 페이지의 PDF를 만들거나, PDF를 함께 압축하십시오.

편집 : 귀하의 의견에 따르면, 실제로 PDF를 표시하고 싶지는 않습니다. 또한, 나는 또 다른 모습을 보였고 루프에 exit 문이 있습니다. 그것은 한 번 이상 실행되지 않습니다. 또한 코드에 큰 텍스트 블록이있을 때 heredoc strings을 사용하는 것이 좋습니다. 그렇게했습니다.

<?php 
// create instance of customer's that need to be created 
$a = new SelectTempOne; 
// obtain response from customers in database that have met timing requirement 
$response = $a->selectUserForOne(); 
// loop through each row in the results and handle then pass to the pdf creation string 
foreach($response as $i => $row) { 

    // statically typing template string to render email address of user 
    $temp1 = <<< HTML 
<!DOCTYPE html> 
<html> 

<head> 
    <title>Template 1</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <link rel="stylesheet" type="text/css" media="screen" href="pdf-templates/temp1/temp1.css" /> 
</head> 

<body> 
    <div id="pdf_header"> 
     <table> 
      <tr> 
       <td>$row[email]</td> 
      </tr> 
     </table> 
    </div> 
</body> 

</html> 
HTML; 

    // pass html to dompdf object 
    $dompdf->loadHtml($temp1); 

    // set option for the paper size and orientation 
    $dompdf->setPaper('A4', 'letter'); 

    // Render the HTML as PDF 
    $dompdf->render(); 

    //save the file to the server 
    $output = $dompdf->output(); 
    file_put_contents("pdf/$row[email].pdf", $output); 

} // end of the for loop 
?> 
+0

저는 혼란 스러울 것이라는 것을 깨달았 기 때문에 제 질문을 편집하고있었습니다. 실제 문제는 첫 번째 PDF 만 작성한다는 것입니다. 나는 서버에 여러 pdf 파일을 만들고 싶다. 이 스크립트는 cron 작업으로 실행되며 사용자가 브라우저에서 볼 수 없습니다. 나는 시험하는 동안 그것을하고 있었다. 그리고 저를 도와 주신 것에 대해 감사드립니다./그래서 스크립트가 실행되면 데이터베이스에 특정 날짜에 등록한 모든 고객에 대해 pdf를 작성해야합니다. 그런 다음 나중에 해당 pdf에 대한 링크를 관리자에게 보여줄 것입니다. – wuno

+0

확인을 클릭하십시오. 루프에 'exit'가 있습니다. – miken32

+0

고마워요. 업데이트를하면 치명적인 오류가 발생합니다. – wuno