2017-03-27 116 views
0

我正在編寫一個腳本,用於檢查數據庫並返回客戶的每一行,該帳戶的開始日期位於特定日期。如果客戶是在指定的日期創建的,則客戶行將被傳遞給我的函數,以便從數據庫中的客戶信息中創建PDF。使用dompdf創建多個PDF文件

問題

我想到了創建一個PDF爲每一個客戶是通過數據環和創建PDF的唯一途徑。這樣做時我有一個問題。

1.只創建第一個用戶的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

Web瀏覽器會請求一個文件。您無法期望能夠向用戶提供多個文檔。你可以撥打$dompdf->stream();一次,就是這樣。您的選擇:動態創建包含單獨鏈接的列表頁面,創建多頁PDF或將PDF壓縮在一起。

編輯:好的,基於您的評論,您實際上並不想顯示PDF。另外,我再看一眼,你的循環中有一個退出語句。這不會超過一次。另外,當代碼中有大量文本時使用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

好的,請參閱修改。你的循環中有一個「退出」。 – miken32

+0

謝謝你。一旦我更新,我現在得到這個致命的錯誤 – wuno