HTML 到 PDF 转换,在 Codeigniter 中支持外部 CSS
HTML to PDF conversion with external CSS support in Codeigniter
在比较了 dompdf、TCPDF、MPDF 中的功能之后,我在这里使用 MPDF 在我的 codeigniter 应用程序中将 HTML 转换为 PDF。在本地主机上,它工作正常。并且 pdf 在 2 或 3 秒内生成。当我将它上传到实时服务器时,创建相同的 pdf 文件需要超过 3 分钟。我已经检查了文件权限。 Pdf 正在生成并保存在文件夹中。但这需要很长时间。
$this->ci->load->library('m_pdf');
$html = $this->ci->load->view('ecommerce/salespdf',$this->data,true);
$m_pdf = $this->ci->m_pdf->load();
$m_pdf->WriteHTML($html);
$filepath = getcwd()."/assets/other_uploads/pdf_files/";
$m_pdf->Output($filepath.$filename, "F");
从上面的代码可以看出,pdf正在指定的文件夹中生成,但是需要很长时间。视图文件中仅包含一个外部 css 文件。
<link href="<?php echo CSS_URL; ?>pdf-invoice.css" rel="stylesheet" type="text/css" />
我的代码有什么问题吗?
我终于修复了这个错误。问题是在视图页面中加载图像。我在这里添加 header 以及公司名称和徽标。
http://domain.com/assets/other_uploads/photo/photo.png
如果我在图像 URL 中提供上述来源,它会尝试在我的视图页面中加载图像,但失败了。所以,我使用下面的代码来解决这个问题。
var/www/domain/assets/other_uploads/photo/photo.png
对于外部 css 问题,我在视图页面中添加了 css 部分作为内部 css。
现在有效!!!
function WriteHTML($html,$bi)
{
//remove all unsupported tags
$this->bi=$bi;
if ($bi)
$html=strip_tags($html,"<a><img><p><br><font><tr><blockquote><h1><h2><h3><h4><pre><red><blue><ul><li><hr><b><i><u><strong><em>");
else
$html=strip_tags($html,"<a><img><p><br><font><tr><blockquote><h1><h2><h3><h4><pre><red><blue><ul><li><hr>");
$html=str_replace("\n",' ',$html); //replace carriage returns with spaces
// debug
if ($this->debug) { echo $html; exit; }
$html = str_replace('™','™',$html);
$html = str_replace('©','©',$html);
$html = str_replace('€','€',$html);
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
$skip=false;
foreach($a as $i=>$e)
{
if (!$skip) {
if($this->HREF)
$e=str_replace("\n","",str_replace("\r","",$e));
if($i%2==0)
{
// new line
if($this->PRE)
$e=str_replace("\r","\n",$e);
else
$e=str_replace("\r","",$e);
//Text
if($this->HREF) {
$this->PutLink($this->HREF,$e);
$skip=true;
} else
$this->Write(5,stripslashes(txtentities($e)));
} else {
//Tag
if (substr(trim($e),0,1)=='/')
$this->CloseTag(strtoupper(substr($e,strpos($e,'/'))));
else {
//Extract attributes
$a2=explode(' ',$e);
$tag=strtoupper(array_shift($a2));
$attr=array();
foreach($a2 as $v) {
if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
$attr[strtoupper($a3[1])]=$a3[2];
}
$this->OpenTag($tag,$attr);
}
}
} else {
$this->HREF='';
$skip=false;
}
}
}
在比较了 dompdf、TCPDF、MPDF 中的功能之后,我在这里使用 MPDF 在我的 codeigniter 应用程序中将 HTML 转换为 PDF。在本地主机上,它工作正常。并且 pdf 在 2 或 3 秒内生成。当我将它上传到实时服务器时,创建相同的 pdf 文件需要超过 3 分钟。我已经检查了文件权限。 Pdf 正在生成并保存在文件夹中。但这需要很长时间。
$this->ci->load->library('m_pdf');
$html = $this->ci->load->view('ecommerce/salespdf',$this->data,true);
$m_pdf = $this->ci->m_pdf->load();
$m_pdf->WriteHTML($html);
$filepath = getcwd()."/assets/other_uploads/pdf_files/";
$m_pdf->Output($filepath.$filename, "F");
从上面的代码可以看出,pdf正在指定的文件夹中生成,但是需要很长时间。视图文件中仅包含一个外部 css 文件。
<link href="<?php echo CSS_URL; ?>pdf-invoice.css" rel="stylesheet" type="text/css" />
我的代码有什么问题吗?
我终于修复了这个错误。问题是在视图页面中加载图像。我在这里添加 header 以及公司名称和徽标。
http://domain.com/assets/other_uploads/photo/photo.png
如果我在图像 URL 中提供上述来源,它会尝试在我的视图页面中加载图像,但失败了。所以,我使用下面的代码来解决这个问题。
var/www/domain/assets/other_uploads/photo/photo.png
对于外部 css 问题,我在视图页面中添加了 css 部分作为内部 css。
现在有效!!!
function WriteHTML($html,$bi)
{
//remove all unsupported tags
$this->bi=$bi;
if ($bi)
$html=strip_tags($html,"<a><img><p><br><font><tr><blockquote><h1><h2><h3><h4><pre><red><blue><ul><li><hr><b><i><u><strong><em>");
else
$html=strip_tags($html,"<a><img><p><br><font><tr><blockquote><h1><h2><h3><h4><pre><red><blue><ul><li><hr>");
$html=str_replace("\n",' ',$html); //replace carriage returns with spaces
// debug
if ($this->debug) { echo $html; exit; }
$html = str_replace('™','™',$html);
$html = str_replace('©','©',$html);
$html = str_replace('€','€',$html);
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
$skip=false;
foreach($a as $i=>$e)
{
if (!$skip) {
if($this->HREF)
$e=str_replace("\n","",str_replace("\r","",$e));
if($i%2==0)
{
// new line
if($this->PRE)
$e=str_replace("\r","\n",$e);
else
$e=str_replace("\r","",$e);
//Text
if($this->HREF) {
$this->PutLink($this->HREF,$e);
$skip=true;
} else
$this->Write(5,stripslashes(txtentities($e)));
} else {
//Tag
if (substr(trim($e),0,1)=='/')
$this->CloseTag(strtoupper(substr($e,strpos($e,'/'))));
else {
//Extract attributes
$a2=explode(' ',$e);
$tag=strtoupper(array_shift($a2));
$attr=array();
foreach($a2 as $v) {
if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
$attr[strtoupper($a3[1])]=$a3[2];
}
$this->OpenTag($tag,$attr);
}
}
} else {
$this->HREF='';
$skip=false;
}
}
}