2015-09-22 59 views
0

我有問題可以創建多個PDF。如果我選擇1檢查來打印PDF,它工作正常,但如果我選擇兩個或更多,然後只打印其中一個選擇。使用DOMPDF創建兩個或多個PDF - codeigniter

在視圖中,我只有一個複選框,它將控制器發送的我希望以PDF格式打印的發票ID。

控制器代碼:

foreach ($this->input->post('check') as $key) 
      { 

       $invoiceData = array('invoice_number' => $key); 
       $this->session->set_userdata($invoiceData); 

       //verify the bank number 
       $storeId = $this->session->userdata('user_store'); 
       $bank = $this->boletos->get_bank_store($storeId)->row(); 

       global $layout; 
       if($bank->idBank == 1){ 
        $layout = load_modulo('BankX', 'invoice_bankX'); 
       } 

       $file_name = 'invoice-'.$key; 
       pdf_create($layout, $file_name, TRUE); 

      } 

的pdf_create功能:

function pdf_create($html, $filename = '', $stream = TRUE) { 
require_once("dompdf/dompdf_config.inc.php"); 

$dompdf = new DOMPDF(); 
$dompdf->load_html($html); 
$dompdf->render(); 

if ($stream) { 
    $dompdf->stream($filename . ".pdf"); 
    //open on browser = $dompdf->stream($filename . ".pdf", array("Attachment" => 0)); 
} else { 

    $output = $dompdf->output(); 
    file_put_contents('Brochure.pdf', $output); 


    } 
} 

就是這樣 - 如果我選擇只有一個檢查它正確生成PDF。但是如果我選擇兩個或更多,它只打印一個。 任何想法如何?

+0

當您嘗試呈現多個PDF時會發生什麼? – BrianS

+0

嗨,@布里斯 - 它只生成一個PDF –

+0

哦,我看到了這個問題。您正在傳輸PDF。確實,您一次只能傳輸一個PDF。如果你需要提供更多的信息,你需要有一個鏈接列表並且可以隨時生成它們,或者預先生成它們並將它們緩存在服務器上。 – BrianS

回答

0

首先讓調整你的PDF創建功能一點:如果你想提供一個以上的PDF你需要單獨渲染他們提供一個鏈接到每一個

function pdf_create($html, $stream = true) { 
    require_once("dompdf/dompdf_config.inc.php"); 
    $dompdf = new DOMPDF(); 
    $dompdf->load_html($html); 
    $dompdf->render(); 

    if ($stream) { 
    $dompdf->stream($filename); 
    } else { 
    return $dompdf->output(); 
    } 
} 

典型。但是如果你打算這麼做的話,你可能只需要提供一個鏈接列表並根據請求渲染每個文檔,而不是預先渲染它們。

除非你想能夠提供某種批處理。在這種情況下,類似下面的內容可以讓您呈現文件。你只需要添加一些代碼給最終用戶訪問:

foreach ($this->input->post('check') as $key) { 
    $invoiceData = array('invoice_number' => $key); 
    $this->session->set_userdata($invoiceData); 

    //verify the bank number 
    $storeId = $this->session->userdata('user_store'); 
    $bank = $this->boletos->get_bank_store($storeId)->row(); 

    global $layout; 
    if ($bank->idBank == 1) { 
    $layout = load_modulo('BankX', 'invoice_bankX'); 
    } 

    $file_name = 'invoice-'.$key.'.pdf'; 
    $pdf = pdf_create($layout, $file_name, false); 
    file_put_contents($file_name, $pdf); 
} 

提供的鏈接,您既可以記錄文件名,或者,如果您將文件保存到每個用戶的目錄列表中,讀出文件列表。

如果你希望能夠呈現所有選定的文件,並給他們的用戶在同一時間,你可以使他們和打包存檔輸出,如.zip文件:

$zipfile = 'invoices.zip'; 
$zip = new ZipArchive; 
$zip->open($zipfile, ZipArchive::CREATE); 
foreach ($this->input->post('check') as $key) { 
    $invoiceData = array('invoice_number' => $key); 
    $this->session->set_userdata($invoiceData); 

    //verify the bank number 
    $storeId = $this->session->userdata('user_store'); 
    $bank = $this->boletos->get_bank_store($storeId)->row(); 

    global $layout; 
    if ($bank->idBank == 1) { 
    $layout = load_modulo('BankX', 'invoice_bankX'); 
    } 

    $file_name = 'invoice-'.$key.'.pdf'; 
    $pdf = pdf_create($layout, $file_name, false); 
    $zip->addFromString($file_name, $pdf); 
} 

header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'.basename($zipfile).'"'); 
header('Content-Length: ' . filesize($zipfile)); 
readfile($zipfile); 

(原諒缺乏錯誤檢查,你應該完全做

最後,而不是使每個文檔分開,你可以每個文檔的輸出組合成一個大文件,插入分頁符之間或間隔頁文件:

$pages = array(); 
foreach ($this->input->post('check') as $key) { 
    $invoiceData = array('invoice_number' => $key); 
    $this->session->set_userdata($invoiceData); 

    //verify the bank number 
    $storeId = $this->session->userdata('user_store'); 
    $bank = $this->boletos->get_bank_store($storeId)->row(); 

    if ($bank->idBank == 1) { 
    $pages[] = load_modulo('BankX', 'invoice_bankX'); 
    } 
} 
$layout = implode('<div style="page-break-before: always;"><div>', $pages); 
pdf_create($layout, 'invoices.pdf', true); 
+0

感謝您的回覆!我要測試這個並返回這裏發佈結果,告訴發生了什麼。 TIA –