2015-09-22 1 views
0

У меня возникла проблема создания нескольких PDF-файлов. Если я выберу 1, чтобы распечатать PDF, он отлично работает, но если я выберу два или более, напечатайте только один из них.Создайте два или более PDF-кодерификатора с DOMPDF

В представлении у меня есть только флажок, который передает контроллеру идентификатор счета, который я хочу распечатать в формате PDF.

код контроллера:

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

Привет, @BrianS - он генерирует только один PDF –

+0

О, я вижу проблему. Вы передаете PDF-файл. Это правда, что вы можете передавать только один PDF за один раз. Если вам нужно предложить больше, вам нужно будет либо иметь список ссылок, либо генерировать их на лету, либо предварительно генерировать их, и кэшировать их на сервере. – BrianS

ответ

0

Первая позволяет настроить вашу функцию создания 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(); 
    } 
} 

Как правило, если вы хотите, чтобы обеспечить более одного PDF вам нужно, чтобы сделать их по отдельности и обеспечить связь для каждого из них. Но если вы собираетесь это сделать, вы можете просто предоставить список ссылок и визуализировать каждый документ в соответствии с запросом, а не предварительно их рендерить.

Если вы не хотите, чтобы у вас была возможность организовать пакетную обработку. В этом случае что-то вроде следующего позволит вам отображать файлы. Вам просто нужно добавить код, чтобы предоставить доступ к конечному пользователю:

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

Спасибо за ваш ответ! Я собираюсь проверить это и вернуться сюда, чтобы опубликовать результаты, рассказывающие, что произошло. ТИА –