在 codeigniter 3 中使用 mPDF 将 html 导出和下载为 pdf 错误:找不到类“Mpdf\Mpdf”

问题描述

我正在尝试通过按 eventView.PHP 中的打印按钮将 html 视图 eventView.PHP 导出并下载到 pdf,使用 mPDF。即使加载速度很慢,我现在也可以转换为 pdf,但现在我可以关于我试图在 pdf 上获取的数据出现错误。基本上我无法转换动态数据,你能帮我如何获取它们吗?

我使用以下方法下载了 mPDF:

作曲家需要 mpdf/mpdf

config.PHP

$config['composer_autoload'] = TRUE;

Incident.PHP 控制器

function get_pdf_test($id)
  {
    $data['incidents'] = $this->incidents_model->getByIdPdf($id);
    $data['incidents_history'] = $this->incidents_model->getById_historyPdf($id); 
    $data['company_name'] = $this->incidents_model->getAllCompanyNamePdf();
    require_once (APPPATH. 'vendor/autoload.PHP');
    $path = '/tmp/mpdf'; 
     if (!file_exists($path)) {
    mkdir($path,0777,true);
     }
     $mpdf = new \Mpdf\Mpdf(['tempDir' => $path]);
     $html = $this->load->view('admin/incidents/incidentsPdf',[],true);
     $mpdf->WriteHTML($html);
     $mpdf->Output(); 
     $mpdf->Output('incidentsPdf.pdf','D'); 

}

incidentPdf.PHP 视图

<div class="TaskView" > 
    <h2 class="heading" ><?PHP echo "ASGB_IN".str_pad($incidents->incidents_id,'4','0',STR_PAD_LEFT);?></h2>
      <!-- <form action="<?PHP echo base_url('get_pdf_test/'.$incidents->id);?>" method="post" >       -->
    <div class="row">
           <div class="form-group col-md-4">
              <label for="email">Incidents ID</label>
              <input type="text" class="form-control" id="T_id" placeholder="Name" name="T_id" value="<?PHP echo "ASGB_IN".str_pad($incidents->incidents_id,STR_PAD_LEFT);?>" readonly>
            </div>
           <div class="form-group col-md-4">
              <label for="email">Incidents Name</label>
              <input type="text" class="form-control" id="Tname" placeholder="Name" name="Tname" value="<?PHP echo $incidents->incident_name;?>" readonly>
            </div>
            <div class="form-group col-md-4">
              <label for="pwd">Company Name</label>
              <input  type="text"class="form-control" id="Cname" name="Cname" value="<?PHP echo $incidents->company_name;?>"readonly>
            </div>
            <div class="form-group col-md-4">
              <label for="pwd">Project Name</label>
              <input type="text" class="form-control" id="Pname" name="Pname" value="<?PHP echo $incidents->project_name;?>" readonly>
            </div>

事件模型.PHP

 function getById_history_pdf($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_array(); 
} 


function getAllCompanyNamePdf()
{
  $query = $this->db->get('company_details');
  $query = $this->db->query('SELECT company_name FROM company_details where delete_flag =0');
  return $query->result_array();
}

function getByIdPdf($id) 
{
   return $this->db->get_where('incidents',array('id'=>$id))->row_array();
}

供应商位置

enter image description here

pdf

enter image description here

解决方法

您正在使用

require_once __DIR__ . '/vendor/autoload.php';

在您的控制器文件中。 __DIR__ 计算为使用它的文件的目录。由于这是一个控制器文件,您正在尝试加载

/opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin/vendor/autoload.php

作为 __DIR__ 评估为 /opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin 这不是正确的路径。

正确的代码是

require_once __DIR__ . '/../../vendor/autoload.php';

更好的解决方案是使用 APPPATH,这样您就不必知道相对路径。

require_once APPPATH.'vendor/autoload.php';

你也可以

$config['composer_autoload'] = true; 

您可以找到更多信息here.

最后,在 GitHb readme.md 中你可以看到这一点。

建议通过 tempDir 配置变量设置自己的临时目录。对于使用 mPDF(通常是 cli、webserver、fpm)的用户,该目录必须具有写入权限(建议使用模式 775)。

这意味着您需要一个可写的文件夹来进行临时操作。您可以将临时位置初始化为您喜欢使用的任何位置

$mpdf = new \Mpdf\Mpdf(['tempDir' => '/tmp']);

/tmp 始终可写。但是,您可以将任何文件夹和路径作为参数作为参数,如

$path = '/tmp/mpdf'; // You should change this as prefered.
if (!file_exists($path)) {
    mkdir($path,0777,true);
}
$mpdf = new \Mpdf\Mpdf(['tempDir' => $path]);
,

确保您的 composer/manual mpdf 安装位于目录中

application\vendor

在你的 config\config.php 中设置

$config['composer_autoload'] = true; 

或在您的控制器中使用:

require_once (APPPATH. 'vendor/autoload.php');

根据安装的 mpdf 版本,您可以使用命名空间 (V.7+),例如:

$mpdf = new \Mpdf\Mpdf();

其他版本(V.6.x)使用​​:

$mpdf = new mPDF();

所以只需像这样更改您的功能:

function DownloadPdf()
{
    //require_once (APPPATH. 'vendor/autoload.php'); //-> you don't need this line if set in config.php
    $mpdf = new mPDF();
    $mpdf->WriteHTML('<h1>Hello world!</h1>');
    $mpdf->Output();    
}

issue documented

,

只需运行 composer dump-autoload 以更新自动加载器...然后 \Mpdf\Mpdf 应该会被知道。如果这不起作用,请检查并修复文件系统权限,然后重试(虽然无法写入 vendor/autoload.php,但显然无法将其添加到自动加载程序中)。

对于 Linux 上的 XAMPP,所有权应该是(不需要 777,也不推荐):

chown -R daemon:daemon /opt/lampp/htdocs

并且通过将另一个用户添加到组 daemon,他们将共享该组的权限。

,

从截图来看,问题似乎不是 mPDF,它似乎是数据。 错误 1:您有未定义的事件,这会导致创建 PDF 的问题。

错误 2:您正在传递一个对象,但是,mPDF 要求您传递一个数组。您将需要使用 asArray 或简单地使用模型的数组返回类型来转换模型返回数据。

参考:https://codeigniter4.github.io/userguide/models/model.html

此外,您不需要在控制器中明确定义自动加载。 从屏幕截图中需要注意的另一件事是它正在创建 PDF,但是,由于抛出错误,您无法正确查看 PDF。

更新:潜在问题可能是数据根本没有传递到视图。以下代码必须传递空数据

 $html = $this->load->view('admin/incidents/incidentsPdf',[],true);

这里的 [] 传递的是空数据,因此即使在控制器中设置了视图,它也可能不会接收任何数据。