使用DOMPDF创建两个或更多PDF - codeigniter

时间:2015-09-22 19:57:41

标签: php codeigniter pdf foreach dompdf

我在创建多个PDF时遇到问题。如果我选择1检查以打印pdf它可以正常工作,但如果我选择两个或更多,那么只打印一个选择。

在视图中,我只有一个复选框,通过控制器传递我想以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。但如果我选择两个或更多,它只打印一个。 任何想法如何?

1 个答案:

答案 0 :(得分: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,则需要单独渲染它们并提供每个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);