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

Posted

技术标签:

【中文标题】使用 mPDF 错误在 codeigniter 3 中将 html 导出并下载为 pdf 错误:找不到类“Mpdf\\Mpdf”【英文标题】:Export & download html to pdf in codeigniter 3 using mPDF erro:Class 'Mpdf\Mpdf' not found使用 mPDF 错误在 codeigniter 3 中将 html 导出并下载为 pdf 错误:找不到类“Mpdf\Mpdf” 【发布时间】:2021-01-10 14:02:57 【问题描述】:

我正在尝试通过按incidentView.php中的打印按钮使用mPDF将html视图incidentView.php导出并下载为pdf。即使加载速度很慢,我现在也可以转换为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, '4', '0', 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>

incident_model.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();

供应商位置

pdf

【问题讨论】:

您存储 MPDF 库? 我需要这样做吗?因为我已经使用以下方法安装了 mPDF:composer require mpdf/mpdf 在控制器上使用之前先包含文件 (Mpdf\Mpdf) @Aman Tiwari 我已添加:require_once DIR。 '/供应商/autoload.php';在我的控制器中,现在出现此错误: require_once(/opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin/vendor/autoload.php): failed to open stream: No such file or directory 不知道为什么你已经包含了这样的供应商自动加载,因为 CI4 已经为每个供应商启用了作曲家库发现。 【参考方案1】:

你正在使用

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]);

【讨论】:

嗯,这似乎是 Vickel 答案的完整克隆......如果你有另一个解决方案会很好,但是旧答案的精确副本不会那么好...... @U11-Forward Vickel 的回答没有说​​明问题的原因,而是直接提出了解决方案。我试图涵盖问题的原因以及如何解决它。另外,如果您检查聊天,他的问题还没有结束。 另外你为什么要编辑带有空格填充块的三引号块?您只在第一个中这样做了,坦率地说,我看不出有什么区别,所以如果我遗漏了什么,让我理解会很棒。 我用过:require_once APPPATH.'vendor/autoload.php';现在出现错误:临时文件目录“/opt/lampp/htdocs/ticketing_tool_v2/application/vendor/mpdf/mpdf/src/Config/../../tmp/mpdf”不可写 我已尝试使文件在 FTP 中可写,但找不到该特定文件【参考方案2】:

确保您的 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

【讨论】:

我已经试过了,还是不行 那么问题是什么? 将供应商放入应用程序文件夹中 你删除了require once这行吗? 是的,通过删除我得到错误:找不到类'Mpdf\Mpdf'【参考方案3】:

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

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

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

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

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

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

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

【讨论】:

我的模型也加了,请看一下。 是的,这里的问题是我无法获取动态数据 print_r($data);死; : 是正确返回数据,但在转换中它没有 @RoxanaSlj 我已经更新了我的答案。看看吧。 我已经改成这样了:$html = $this->load->view('admin/incidents/incidentsPdf', $data,true);【参考方案4】:

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

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

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

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

【讨论】:

错误:临时文件目录“/opt/lampp/htdocs/ticketing_tool_v2/application/vendor/mpdf/mpdf/src/Config/../../tmp/mpdf”不可写怎么能我让它可写?我在 ftp 中使用过 777,但还是一样 使用 SSH2 而不是 FTP(使用允许在此处写入的用户)。 chmod 777 总是一个坏主意;而是chown -R user:group /opt/lampp/htdocs。在 Linux 上,使用这种 LAMPP 发行版也没什么用,因为可以使用包管理器安装所有这些;盒子外面。但根据错误信息,可以假设我的猜测是正确的。 如果您能够离线运行composer dump-autoload,然后通过 FTP 上传生成的文件,它也可能会成功。我不太确定,因为我不使用任何 LAMPP ...但我认为用户和组在那里被称为 daemon(配置文件应该提供确定性)。

以上是关于使用 mPDF 错误在 codeigniter 3 中将 html 导出并下载为 pdf 错误:找不到类“Mpdf\Mpdf”的主要内容,如果未能解决你的问题,请参考以下文章

mPDF 库不适用于 php7.2 codeigniter

如何在codeigniter中使用mpdf?

Codeigniter - mPDF 导出空白页

如何使用 mPDF 和 CodeIgniter 保存 PDF 文件

在 codeigniter 中使用 MPDF 设置格式视图导出 PDF

MPDF PAGENO在codeigniter中无法在pdf中显示页码