我在创建多个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。但如果我选择两个或更多,它只打印一个。 任何想法如何?
答案 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);