使用 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();
供应商位置
【问题讨论】:
您存储 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 和 CodeIgniter 保存 PDF 文件