不能使用 for 循环用 dompdf 渲染两个 pdf
Cannot use for loop to render two pdf with dompdf
这些 PDF 是相同的代码和相同的格式,区别在于文本语言。它可以呈现第一个 PDF,但在第二个 PDF 上不成功。我使用以下导致错误 500 的代码对 dompdf 进行了测试。另外,我使用了 Codeigniter 框架。这是 dompdf 的错误还是我的错误?
$lang_array = array("chi","eng");
$i = 0;
foreach($lang_array as $lang)
{
$html = "<!DOCTYPE html><html><body>M</body></html>";
$this->dompdf->load_html($html);
$this->dompdf->set_paper("A4", 'portrait');
$this->dompdf->render();
$output = $this->dompdf->output();
file_put_contents($i.".pdf", $output);
$i++;
}
$html = "<!DOCTYPE html><html><body>";
$html .= "<div>DATA 1 (chi)</div>";
$html .= "<div>DATA 1 (eng)</div>";
$html .= "</body></html>";
$this->dompdf->load_html($html)
$dompdf->dompdf->set_paper("A4", 'portrait');
$dompdf->render();
$dompdf->stream("sample.pdf");
Try to put content on both div which fill whole A4 page. This separate the pdf into two parts. Page-1 and page-2
如您所见,您不能重复使用现有的 dompdf 实例。渲染完成后,会创建很多内部对象,dompdf 目前没有删除方法。
但这并不是说您不能呈现多个文档。您只需要重新实例化 dompdf。通常你会做类似下面的事情:
foreach ($htmldocs as $index => $html) {
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
file_put_contents($index . '.pdf', $output);
unset($dompdf);
}
我过去发现,通过将 dompdf 呈现组件隔离到一个单独的脚本并生成一个新进程来执行呈现,可以获得更好的性能。所以你的 foreach
会是这样的:
foreach ($htmldocs as $index => $html) {
file_put_contents($index . '.html', $html);
exec('php dompdf.php ' . $index . '.html');
}
而 dompdf.php 类似于:
$dompdf = new DOMPDF();
$dompdf->load_html_file($argv[1]);
$dompdf->render();
file_put_contents(str_replace('.html', '.pdf', $argv[1]), $dompdf->output());
如何在 Codeigniter 中完成此操作取决于您的实现。您正在引用 class 属性(也许来自控制器实例?)所以我怀疑您可能需要重写一些东西。如果您添加更多实施细节,我们可以进一步指导您。
这些 PDF 是相同的代码和相同的格式,区别在于文本语言。它可以呈现第一个 PDF,但在第二个 PDF 上不成功。我使用以下导致错误 500 的代码对 dompdf 进行了测试。另外,我使用了 Codeigniter 框架。这是 dompdf 的错误还是我的错误?
$lang_array = array("chi","eng");
$i = 0;
foreach($lang_array as $lang)
{
$html = "<!DOCTYPE html><html><body>M</body></html>";
$this->dompdf->load_html($html);
$this->dompdf->set_paper("A4", 'portrait');
$this->dompdf->render();
$output = $this->dompdf->output();
file_put_contents($i.".pdf", $output);
$i++;
}
$html = "<!DOCTYPE html><html><body>";
$html .= "<div>DATA 1 (chi)</div>";
$html .= "<div>DATA 1 (eng)</div>";
$html .= "</body></html>";
$this->dompdf->load_html($html)
$dompdf->dompdf->set_paper("A4", 'portrait');
$dompdf->render();
$dompdf->stream("sample.pdf");
Try to put content on both div which fill whole A4 page. This separate the pdf into two parts. Page-1 and page-2
如您所见,您不能重复使用现有的 dompdf 实例。渲染完成后,会创建很多内部对象,dompdf 目前没有删除方法。
但这并不是说您不能呈现多个文档。您只需要重新实例化 dompdf。通常你会做类似下面的事情:
foreach ($htmldocs as $index => $html) {
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
file_put_contents($index . '.pdf', $output);
unset($dompdf);
}
我过去发现,通过将 dompdf 呈现组件隔离到一个单独的脚本并生成一个新进程来执行呈现,可以获得更好的性能。所以你的 foreach
会是这样的:
foreach ($htmldocs as $index => $html) {
file_put_contents($index . '.html', $html);
exec('php dompdf.php ' . $index . '.html');
}
而 dompdf.php 类似于:
$dompdf = new DOMPDF();
$dompdf->load_html_file($argv[1]);
$dompdf->render();
file_put_contents(str_replace('.html', '.pdf', $argv[1]), $dompdf->output());
如何在 Codeigniter 中完成此操作取决于您的实现。您正在引用 class 属性(也许来自控制器实例?)所以我怀疑您可能需要重写一些东西。如果您添加更多实施细节,我们可以进一步指导您。