使用 mPDF erro:Class 'Mpdf\Mpdf' 未找到在 codeigniter 3 中导出并下载 html 为 pdf
Export & download html to pdf in codeigniter 3 using mPDF erro:Class 'Mpdf\Mpdf' not found
我正在尝试通过按 incidentView.php 中的打印按钮将 html 视图 incidentView.php 导出并下载为 pdf,现在使用 mPDF.I 可以转换为 pdf尽管加载速度很慢,但现在我在尝试获取数据时遇到错误 pdf.Basically 我无法转换动态数据 你能帮我如何获取它们吗?
我已经通过以下方式下载了 mPDF:
composer require 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
确保您的 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();
}
您正在使用
require_once __DIR__ . '/vendor/autoload.php';
在你的控制器文件中。 __DIR__
评估为使用它的文件的目录。由于这是一个控制器文件,您正在尝试加载
/opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin/vendor/autoload.php
as __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 你可以看到这个。
It is recommended to set one's own temporary directory via tempDir configuration variable. The directory must have write permissions (mode 775 is recommended) for users using mPDF (typically cli, webserver, fpm).
这意味着您需要一个可写的文件夹来进行临时操作。您可以使用
将临时位置初始化为您喜欢的任何位置
$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 dump-autoload
以更新自动加载程序...然后 \Mpdf\Mpdf
应该会被知道。如果那不可行,请检查并修复文件系统权限,然后重试(虽然 vendor/autoload.php
无法写入,但显然无法将其添加到自动加载程序中)。
对于 Linux 上的 XAMPP,所有权应该是(没有 777
要求,也不推荐):
chown -R daemon:daemon /opt/lampp/htdocs
并且通过将另一个用户添加到组 daemon
,他们将共享该组的权限。
从截图来看,问题似乎不是mPDF,而是数据。
错误 1:您有未定义的事件,这是导致创建 PDF 的问题。
错误2:您正在传递一个对象,但是,mPDF 要求您传递一个数组。您将需要使用 asArray 或简单地使用模型的 return 类型的数组来转换模型 Return 数据。
参考:https://codeigniter4.github.io/userguide/models/model.html
另外,您不需要在控制器中明确定义自动加载。
从屏幕截图中要注意的另一件事是它正在创建 PDF,但是,由于抛出错误,您无法正确查看 PDF。
更新:潜在的问题可能是数据根本没有传递给视图。以下代码必须传递空数据
$html = $this->load->view('admin/incidents/incidentsPdf',[],true);
此处[]传递的是空数据,因此即使在控制器中设置了View,也可能收不到任何数据。
我正在尝试通过按 incidentView.php 中的打印按钮将 html 视图 incidentView.php 导出并下载为 pdf,现在使用 mPDF.I 可以转换为 pdf尽管加载速度很慢,但现在我在尝试获取数据时遇到错误 pdf.Basically 我无法转换动态数据 你能帮我如何获取它们吗?
我已经通过以下方式下载了 mPDF:
composer require 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
确保您的 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();
}
您正在使用
require_once __DIR__ . '/vendor/autoload.php';
在你的控制器文件中。 __DIR__
评估为使用它的文件的目录。由于这是一个控制器文件,您正在尝试加载
/opt/lampp/htdocs/ticketing_tool_v2/application/controllers/admin/vendor/autoload.php
as __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 你可以看到这个。
It is recommended to set one's own temporary directory via tempDir configuration variable. The directory must have write permissions (mode 775 is recommended) for users using mPDF (typically cli, webserver, fpm).
这意味着您需要一个可写的文件夹来进行临时操作。您可以使用
将临时位置初始化为您喜欢的任何位置$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 dump-autoload
以更新自动加载程序...然后 \Mpdf\Mpdf
应该会被知道。如果那不可行,请检查并修复文件系统权限,然后重试(虽然 vendor/autoload.php
无法写入,但显然无法将其添加到自动加载程序中)。
对于 Linux 上的 XAMPP,所有权应该是(没有 777
要求,也不推荐):
chown -R daemon:daemon /opt/lampp/htdocs
并且通过将另一个用户添加到组 daemon
,他们将共享该组的权限。
从截图来看,问题似乎不是mPDF,而是数据。 错误 1:您有未定义的事件,这是导致创建 PDF 的问题。
错误2:您正在传递一个对象,但是,mPDF 要求您传递一个数组。您将需要使用 asArray 或简单地使用模型的 return 类型的数组来转换模型 Return 数据。
参考:https://codeigniter4.github.io/userguide/models/model.html
另外,您不需要在控制器中明确定义自动加载。 从屏幕截图中要注意的另一件事是它正在创建 PDF,但是,由于抛出错误,您无法正确查看 PDF。
更新:潜在的问题可能是数据根本没有传递给视图。以下代码必须传递空数据
$html = $this->load->view('admin/incidents/incidentsPdf',[],true);
此处[]传递的是空数据,因此即使在控制器中设置了View,也可能收不到任何数据。