在 Codeigniter 中使用外部 CSS 支持将 HTML 转换为 PDF

Posted

技术标签:

【中文标题】在 Codeigniter 中使用外部 CSS 支持将 HTML 转换为 PDF【英文标题】:HTML to PDF conversion with external CSS support in Codeigniter 【发布时间】:2015-06-29 11:55:44 【问题描述】:

在比较了 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" />

我的代码有什么问题吗?

【问题讨论】:

【参考方案1】:

最后我修复了这个错误。问题是在视图页面内加载图像。在这里,我添加带有公司名称和徽标的标题。

http://domain.com/assets/other_uploads/photo/photo.png

如果我在图像 URL 中提供上述来源,它会尝试在我的视图页面中加载图像并且失败。所以,我用下面的代码来解决这个问题。

var/www/domain/assets/other_uploads/photo/photo.png

对于外部 css 问题,我将视图页面中的 css 部分添加为内部 css。

现在可以了!!!

【讨论】:

【参考方案2】:
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('&trade;','™',$html);
        $html = str_replace('&copy;','©',$html);
        $html = str_replace('&euro;','€',$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;
            
        
    

【讨论】:

以上是关于在 Codeigniter 中使用外部 CSS 支持将 HTML 转换为 PDF的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeIgniter 中有效地缩小 CSS 和 JS

Codeigniter:无法链接引用的 css 文件

在 CodeIgniter 3 中设置数据库连接超时

我使用啥路径在codeigniter中调用背景图像

codeigniter css 样式

Codeigniter 3 - 从外部 Codeigniter 安装访问会话