【问题标题】:Image & Css not working using codeigniter 3 dompdf图像和 Css 无法使用 codeigniter 3 dompdf
【发布时间】:2021-01-15 07:51:09
【问题描述】:

我正在使用 codeigniter 3dompdf 将 html 视图转换为 pdf。我可以成功地将 html 转换为 pdf,但没有应用适当的样式。 所有必需的 css 文件都已作为自定义设计包含在视图文件中。

我还需要做什么才能正确包含 css 样式和图像?

这里是控制器:

public function get_pdf_test($id)
  {
    //  print_r($_REQUEST);
    //   die;
      $data['incidents'] = $this->incidents_model->getById($id);
      $data['incidents_history'] = $this->incidents_model->getById_history($id); 
      $data['company_name'] = $this->incidents_model->getAllCompanyName();
     
      generate_pdf("admin/incidents/incidentsView.pdf", "admin/incidents/incidentsView.php", $data);
    
      }

incident_model.php

     function getById($id) 
    {
  
       return $this->db->get_where('incidents',array('id'=>$id))->row();
    }
 function getById_history($id)
    {
        $query=$this->db->query("SELECT incidents_id FROM incidents WHERE id = $id");
        $get_row = $query->row();
        $incident_id = $get_row->incidents_id;
        
        $this->db->select('*');
        $this->db->where(array('incidents.incidents_id'=>$incident_id));
        $this->db->join('incident_status', 'incidents.id = incident_status.incident_id');
        return $this->db->get('incidents')->result(); 
    } 
function getAllCompanyName()
    {
      $query = $this->db->get('company_details');
      $query = $this->db->query('SELECT company_name FROM company_details where delete_flag =0');
      return $query->result();
    }

库中的 Pdf.php 文件:

 <?php defined('BASEPATH') OR exit('No direct script access allowed');
/**
 *
 * Convert HTML to PDF in CodeIgniter applications.
 *
 * @package            CodeIgniter
 * @subpackage        Libraries
 * @category        Libraries
 * @author            Hostmystory
 * @link            https://www.hostmystory.com
 */

// Dompdf namespace
use Dompdf\Dompdf;

class Pdf
{
    public function __construct(){   
        // require_once autoloader 
        require_once dirname(__FILE__).'/dompdf/autoload.inc.php';
        $pdf = new DOMPDF();
        $CI =& get_instance();
        $CI->dompdf = $pdf;

    }
}
?>

helper 中的new_helper.php:

<?php defined('BASEPATH') OR exit('No direct script access allowed');
// generate pdf
function generate_pdf($name, $tpl, $data)
{
    $ci = &get_instance();
    $data['data'] = $data;
    $ci->load->view($tpl, $data);
    // Get output html
    $html = $ci->output->get_output();
// add external css library
    $html .= '<link href="' . base_url() . 'assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">';

    // Load pdf library
    $ci->load->library('pdf');
    $ci->dompdf->loadHtml($html);
    // setup size
    $ci->dompdf->setPaper('A4', 'portrait');
    // Render the HTML as PDF
    $ci->dompdf->render();
    // Output  PDF (1 = download and 0 = preview)
    $ci->dompdf->stream($name, array("Attachment" => 0));
}
?>

这是 dompdf 的输出:

【问题讨论】:

  • 我已经用一个新的解决方案更新了我的答案,如果它对你有用,请告诉我。

标签: css image codeigniter codeigniter-3 dompdf


【解决方案1】:

回答你的问题

图像和 Css 无法使用 codeigniter 3 dompdf 工作

按照您的示例,我安装了 CI 3.11.1Dompdf 1.0.2 并提出了 2 个解决方案

解决方案 1 - 设置 dompdf 选项:

在您的库中加载 dompdf,并将选项 enable_remote 设置为 true:

$pdf = new Dompdf(array('enable_remote' => true));

图片

在您的 html 中使用 base_url() 创建一个绝对图像路径,例如:

<img src="<?=base_url('assets/_img/logo.png')?>" />

CSS

你的方法现在应该奏效了。


解决方案 2 - 嵌入:

图片:另一种显示图片的方式是嵌入图片,使用data URI scheme
base64_encode():

为此,您必须使用absolute/path/to/your_image,CI 可以通过其base_url() 函数轻松启用它

$imgpath=base_url('assets/_img/logo.png');
$ext= pathinfo($imgpath, PATHINFO_EXTENSION);
$data = file_get_contents($imgpath);
$base64 = 'data:image/' . $ext. ';base64,' . base64_encode($data);

样式表:要添加 css 样式表,您可以在 &lt;style&gt;&lt;/style&gt; 元素之间嵌入样式表,再次使用绝对路径获取它:

$path = base_url('assets/_css/dompdf.css');
$data = file_get_contents($path);
//$css = '<link type="text/css" href="'.$data.'" rel="stylesheet" />';  // couldn’t get this to work
$css="<style>$data</style>";

这是我使用的样式表:

@charset "utf-8";
/* CSS Document */

.red{
    color:red; 
    width:100%; 
    margin-bottom:50px;
    font-family: sans-serif; 
    font-size:48px;
}
img{
    width:300px; 
    height:300px;
    margin-bottom:10px;
}

所以最后一个可能的 html 看起来像这样:

$html='<div class="red">Hello world!</div><img src="'.$base64.'"/><div>unformated text</div>';

为了创建 pdf,我们加载库并发送 $css$html 来构建它:

$this->load->library('pdf');
$this->dompdf->loadHtml($css.$html);
$this->dompdf->setPaper('A4', 'landscape');
$this->dompdf->render();
$this->dompdf->stream("welcome.pdf", array("Attachment"=>0));

可能的输出:

注意Dompdf 1.0.1 基本上仅限于 css2 标准(少数 css3 例外),请参阅:Dompdf Features

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2021-06-25
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多