Closed koheitaka closed 1 year ago
I just found the cause and solution to this problem. In my case it's because of mpdf default tmpDir is pointing to /tmp
system folder (Linux system) and my php run under nginx user.
I just need to change the temp_dir
on the config file
'temp_dir' => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR), // change this to storage_path('app/mpdf') for example
Hope this helps 😁
Same Problem , Bot not solved
Same Problem , Bot not solved
Can you show me your code and how is your environment setup? Same error message can leads to different root cause problems depending on how and where you implemented the code.
Config/pdf.php
'custom_font_data' => [],
'auto_language_detection' => false,
// 'temp_dir' => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR),
'temp_dir' => storage_path('app'),
'pdfa' => false,
composer json
require": { "php": "^7.3|^8.0", "carlos-meneses/laravel-mpdf": "^2.1", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", "haruncpi/laravel-id-generator": "^1.1", "laravel/framework": "^8.75", "laravel/jetstream": "^2.9", "laravel/sanctum": "^2.11", "laravel/tinker": "^2.5", "laravel/ui": "^3.4", "livewire/livewire": "^2.5", "niklasravnsborg/laravel-pdf": "^4.1", "spatie/laravel-permission": "^5.5" },
controller
$this->authorize('customers.list');
$Customer= Customer::findorfail($id)->with('group', 'somity', 'loans', 'dpss', 'transactionReportss', 'Clubs', 'nominee', 'grantator')->first();
// $CustomerGroups = LookupMaster::where('keyword', 'customer_group')->get();
$CustomerGuarantor = CustomerGuarantor::where('customer_id', $id)->first();
// $CustomerNominee = CustomerNominee::where('customer_id', $id)->first();
// $Somity = Somity::where('id', $Customer->somity_id)->where('is_active', 1)->first();
// dd($Customer);
$data = [
'Customer' => $Customer,
];
$pdf = PDF::loadView('backend.modules.customer.print_view', $Customer);
$pdf->SetProtection(['copy', 'print'], '', 'pass');
return $pdf->stream('document.pdf');
PDF facade does not return a MPDF
instance, It returns a LaravelMpdfWrapper
instance. The SetProtection
method does not available in LaravelMpdfWrapper
instance.
You must use the getMpdf()
method available in LaravelMpdfWrapper
instance to access MPDF
instance.
// ...
$mpdf = $pdf->getMpdf();
$mpdf->SetProtection(/*...*/);
What is your PHP version installed in your environment?
I see you have this version installed:
"carlos-meneses/laravel-mpdf": "^2.1",
I recommend not to use ^
:
"carlos-meneses/laravel-mpdf": "2.1.5",
I hope help you.
Config/pdf.php
'custom_font_data' => [], 'auto_language_detection' => false, // 'temp_dir' => rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR), 'temp_dir' => storage_path('app'), 'pdfa' => false,
composer json
require": { "php": "^7.3|^8.0", "carlos-meneses/laravel-mpdf": "^2.1", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", "haruncpi/laravel-id-generator": "^1.1", "laravel/framework": "^8.75", "laravel/jetstream": "^2.9", "laravel/sanctum": "^2.11", "laravel/tinker": "^2.5", "laravel/ui": "^3.4", "livewire/livewire": "^2.5", "niklasravnsborg/laravel-pdf": "^4.1", "spatie/laravel-permission": "^5.5" },
controller$this->authorize('customers.list'); $Customer= Customer::findorfail($id)->with('group', 'somity', 'loans', 'dpss', 'transactionReportss', 'Clubs', 'nominee', 'grantator')->first(); // $CustomerGroups = LookupMaster::where('keyword', 'customer_group')->get(); $CustomerGuarantor = CustomerGuarantor::where('customer_id', $id)->first(); // $CustomerNominee = CustomerNominee::where('customer_id', $id)->first(); // $Somity = Somity::where('id', $Customer->somity_id)->where('is_active', 1)->first(); // dd($Customer); $data = [ 'Customer' => $Customer, ]; $pdf = PDF::loadView('backend.modules.customer.print_view', $Customer); $pdf->SetProtection(['copy', 'print'], '', 'pass'); return $pdf->stream('document.pdf');
Your code should produce error like : Method Meneses\LaravelMpdf\LaravelMpdf::SetProtection does not exist.
because just like what @mccarlosen mentioned above. You're calling MPDF
instance method from the PDF facade which return LaravelMpdfWrapper
.
So, I think it's unrelated to this issue.
PDF facade does not return a
MPDF
instance, It returns aLaravelMpdfWrapper
instance. TheSetProtection
method does not available inLaravelMpdfWrapper
instance.You must use the
getMpdf()
method available inLaravelMpdfWrapper
instance to accessMPDF
instance.// ... $mpdf = $pdf->getMpdf(); $mpdf->SetProtection(/*...*/);
if I remove set protection, same result
What is your PHP version installed in your environment?
I see you have this version installed:
"carlos-meneses/laravel-mpdf": "^2.1",
I recommend not to use
^
:"carlos-meneses/laravel-mpdf": "2.1.5",
I hope help you.
PHP 8.1
@islamyearul Did you run php artisan config:clear
after you publish the pdf.php config and set the temp_dir
to storage_path('app')
and make sure the folder mpdf/ttfontdata
is located at storage/app/*
?
@aanfarhan yeah, run this command, and directory is available . but when hit loadView, only reloading . nothing to show
@islamyearul so there is no error being thrown anymore? Just blank page? If that the case then it's probably another issue and not related to error Undefined array key "dejavusanscondensed"
.
Hi @koheitaka,
I'm having this error Illuminate\Foundation\Bootstrap\HandleExceptions::handleError C:\xampp\htdocs\fiamedical\vendor\mpdf\mpdf\src\Otl.php:154
and here's my controller
$pdf = MPDF::loadView('/printouts/salesagentreagents',array('data' => $data,'from' => $from,'to' => $to),[],[ 'margin_left'=> 35, 'margin_right'=> 15, 'default_font_size'=> '8', 'default_font'=> 'DejaVu Sans', 'format'=> 'Legal', 'orientation'=> 'L']);
return $pdf->stream();
I think the font name is incorrect DejaVu Sans
. You must write DejaVuSans
without spaces. Review documentation:
Available fonts v6 and v7
@islamyearul Could you provide more detail? Your configuration full file and what is the error you receive?
@mccarlosen mccarlosen Which file? Not fixed my print page with use JavaScript except Laravel package.
@islamyearul Could you show your blade view? It's strange.
@mccarlosen
<!-- <div id="head"> -->
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
{{-- <title>@lang('menu.Transactions') </title> --}}
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
{{-- Data table --}}
<link rel="stylesheet" href="https://cdn.datatables.net/1.12.1/css/jquery.dataTables.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.2.3/css/buttons.dataTables.min.css">
<style>
/* img {
-webkit-print-color-adjust: exact;
} */
</style>
<style>
body {
margin: 0;
padding: 0;
background-color: #FAFAFA;
font: 8pt "Tahoma";
}
* {
box-sizing: border-box;
-moz-box-sizing: border-box;
}
.page {
width: 21cm;
min-height: 29.7cm;
padding: 1cm;
margin: 1cm auto;
border: 1px #D3D3D3 solid;
border-radius: 5px;
background: white;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
.subpage {
/* padding: 1cm; */
border: 5px red solid;
height: 256mm;
outline: 2cm #FFEAEA solid;
}
@page {
size: A4;
margin: 0;
}
@media print {
.page {
margin: 0;
border: initial;
border-radius: initial;
width: initial;
min-height: initial;
box-shadow: initial;
background: initial;
page-break-after: always;
}
}
td {
padding: 5px;
}
p {
margin: 0;
}
.text-left {
text-align: left;
}
.img-thumbnail {
width: 100px;
height: 100px;
border: 5px solid #555
}
table {
width: 100%;
}
.table-bordered,
.table-bordered td,
.table-bordered th {
border: 1px solid black;
border-collapse: collapse;
padding: 5px;
}
li {
list-style: none;
}
.text-center {
text-align: center;
}
</style>
</head>
<!-- {{-- </div> --}} -->
<body>
<div class="container">
<div class="book">
<div class="page">
<div class="subpage">
<div style="border-bottom: 1px solid #ccc;">
<table>
<tr>
<td style="width:40%">
<div class=" ">
@if (isset($Customer['somity']['somity_logo']))
<img src="{{ asset($Customer['somity']['somity_logo']) }}" alt="logo"
height="80" />
@endif
<ul class="list-unstyled mb-0">
<li>
<h5>{{ $Customer['Somity']['somity_name'] }}</h5>
</li>
<li>{{ $Customer['somity']['somity_reg_no'] }}</li>
<li>{{ $Customer['somity']['somity_bis_address'] }}</li>
<li>{{ $Customer['somity']['somity_phone'] }}</li>
</ul>
</div>
</td>
<td style="width:50%">
</td>
<td style="width:10%">
<a href="" class="btn btn-danger" id="printData">Print</a>
</td>
</tr>
</table>
</div>
<div style="border-bottom: 1px solid #ccc;">
<table>
<tr>
<td style="width: 25%">
<div class="text-center" style="border-right: 1px solid #ccc;">
<div class=" row text-center" style="text-align: center">
<div class="">
@if (isset($Customer->customer_image))
<img src="{{ asset($Customer->customer_image) }}"
class="text-center" style="text-align: center" alt="logo"
height="80" />
@endif
<h4> {{ $Customer->customer_name }}</h4>
<p>Customer No: {{ $Customer->id }} </p>
<p>Reg Date: {{ $Customer->customer_reg_date }}</p>
</div>
</div>
</div>
</td>
<td style="width: 37%">
<div class="" style="border-right: 1px solid #ccc;">
<table class="table " id="">
<tr>
<td style="text-align: left">@lang('form.Account No')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_account_no }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_name }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Father Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_fname }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Mother Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_mname }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Address')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_address }}</td>
</tr>
</table>
</div>
</td>
<td style="width: 38%">
<div class="">
<table class="table" id="">
<tr>
<td style="text-align: left">@lang('form.Phone')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_phone }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Dob')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_dob }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Area')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_area }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Nid')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_nid }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Registration Date')</td>
<td style="width: 10%">:</td>
<td style="text-align: right"> {{ $Customer->customer_reg_date }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Status')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
@if ($Customer->status == 1)
<span class="">@lang('form.Active')</span>
@else
<span class="r">@lang('form.Inactive')</span>
@endif
</td>
</tr>
</table>
</div>
</td>
</tr>
</table>
</div>
<div class="row my-3" style="border-bottom: 1px solid #ccc;">
<table>
<tr>
<td style="width: 50%">
<div class="" style="border-right: 1px solid #ccc;">
<h4>@lang('form.Guarantator')</h4>
<table class="table table-boardered table-responsive-sm">
@if ($Customer['grantator'])
<tr>
<td style="text-align: left">@lang('form.Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['grantator']['gun_name'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Phone')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['grantator']['gun_phone'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Father/Husband Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['grantator']['gun_father_name_husband_name'] }}
</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Address')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['grantator']['gun_address'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Dob')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['grantator']['gun_date_of_birth'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Relation')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['grantator']['gun_relation'] }}
</td>
</tr>
@else
<p>@lang('form.Guarantor Not Assigned')</p>
@endif
</table>
</div>
</td>
<td style="width: 50%">
<div class="">
<h4>@lang('form.Nominee')</h4>
<table class="table table-boardered table-responsive-sm">
@if ($Customer['nominee'])
<tr>
<td style="text-align: left">@lang('form.Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['nominee']['nom_name'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Phone')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['nominee']['nom_phone'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Father/Husband Name')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['nominee']['nom_father_name_husband_name'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Address')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['nominee']['nom_address'] }}</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Dob')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['nominee']['nom_date_of_birth'] }}
</td>
</tr>
<tr>
<td style="text-align: left">@lang('form.Relation')</td>
<td style="width: 10%">:</td>
<td style="text-align: right">
{{ $Customer['nominee']['nom_relation'] }}</td>
</tr>
@else
<p>@lang('form.Nominee Not Assigned')</p>
@endif
</table>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="page_break"> </div>
<div class="page">
<div class="subpage">
<div class="col-md-12">
<h3 style="text-align: center">@lang('menu.Loans')</h3>
<table class="table table-bordered" id="">
<thead>
<tr>
<th scope="col">@lang('form.Loan No')</th>
<th scope="col">@lang('form.Customer Name')</th>
<th scope="col">@lang('form.Amount')</th>
<th scope="col">@lang('form.Rate')</th>
<th scope="col">@lang('form.Loan Status')</th>
<th scope="col">@lang('form.Remaining')</th>
<th scope="col">@lang('form.Paid')</th>
</tr>
</thead>
<tbody>
@foreach ($Customer['loans'] as $Loan)
<tr>
<td>{{ $Loan->loan_number }}</td>
<td>{{ $Loan['customer']['customer_name'] }}</td>
<td>{{ $Loan->total_amount }}</td>
<td>{{ $Loan->interest_rate }}</td>
<td>{{ $Loan['loan_status']['name'] }}</td>
<td>{{ $Loan->remaining_amount }}</td>
<td>{{ $Loan->paid_amount }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="col-md-12">
<h3 style="text-align: center">@lang('menu.Club')</h3>
<table class="table table-bordered" id="">
<thead>
<tr>
<th scope="col">@lang('menu.Customers')</th>
<th scope="col">@lang('form.Diposite')</th>
<th scope="col">@lang('form.Diposite 1')</th>
<th scope="col">@lang('form.Diposite 2')</th>
<th scope="col">@lang('form.Fine')</th>
<th scope="col">@lang('form.Fine 1')</th>
<th scope="col">@lang('form.Due')</th>
<th scope="col">@lang('form.Total')</th>
<th scope="col">@lang('form.Date')</th>
</tr>
</thead>
<tbody>
@foreach ($Customer['Clubs'] as $Club)
<tr>
<td>{{ $Club['customer']['customer_name'] }}</td>
<td>{{ $Club->diposit }}</td>
<td>{{ $Club->diposit_1 }}</td>
<td>{{ $Club->diposit_2 }}</td>
<td>{{ $Club->fine }}</td>
<td>{{ $Club->fine_1 }}</td>
<td>{{ $Club->due }}</td>
<td>{{ $Club->total }}</td>
<td>{{ $Club->date }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="col-md-12">
<h3 style="text-align: center">@lang('menu.DPS')</h3>
<table class="table table-bordered " id="">
<thead>
<tr>
<th scope="col">@lang('form.Dps No')</th>
<th scope="col">@lang('form.Customer')</th>
<th scope="col">@lang('form.From')</th>
<th scope="col">@lang('form.Installments')</th>
<th scope="col">@lang('form.Rate')</th>
<th scope="col">@lang('form.Total')</th>
<th scope="col">@lang('form.Date')</th>
<th scope="col">@lang('form.Status')</th>
</tr>
</thead>
<tbody>
@foreach ($Customer['dpss'] as $dps)
<tr>
<td>{{ $dps->dps_no }}</td>
<td>{{ $dps['customer']['customer_name'] }}</td>
<td>{{ $dps->dps_from }}</td>
<td>{{ $dps->installments }}</td>
<td>{{ $dps->rate }}</td>
<td>{{ $dps->total }}</td>
<td>{{ $dps->date }}</td>
<td>
@if ($dps->status == 1)
<span class="">@lang('form.Active')</span>
@else
<span class="">@lang('form.Inactive')</span>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="col-md-12">
<h3 style="text-align: center">@lang('menu.Transactions')</h3>
<table class="table table-bordered">
<thead>
<tr>
<th scope="col">@lang('form.Date')</th>
<th scope="col">@lang('form.Time')</th>
<th scope="col">@lang('form.Customer')</th>
<th scope="col">@lang('form.Transaction Type')</th>
<th scope="col">@lang('form.Amount')</th>
<th scope="col">@lang('form.Txn')</th>
</tr>
</thead>
<tbody>
@foreach ($Customer['transactionReportss'] as $TransactionReport)
<tr>
<td>{{ $TransactionReport->transaction_date }}</td>
<td>{{ $TransactionReport->transaction_time }}</td>
<td>{{ $TransactionReport['customer']['customer_name'] }}</td>
<td>{{ $TransactionReport->transaction_type }}</td>
<td>{{ $TransactionReport->transaction_amount }}</td>
<td>{{ $TransactionReport->Txn }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{{-- J query --}}
<script src="https://code.jquery.com/jquery-3.6.1.min.js"
integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
{{-- <script src="{{ asset('plugins/DataTables/js/jquery-3.5.1.js') }}"></script> --}}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.datatables.net/1.12.1/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.2.3/js/dataTables.buttons.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/vfs_fonts.js"></script>
<script src="https://cdn.datatables.net/buttons/2.2.3/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.2.3/js/buttons.print.min.js"></script>
<script src="https://cdn.datatables.net/buttons/2.2.3/js/buttons.colVis.min.js"></script>
<script>
$(document).ready(function() {
$(document).ready(function() {
$('#printData').on('click', function() {
$('#printData').hide();
window.print();
$('#printData').show();
});
});
});
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
What is the error? You must show the error you receive. Reopen the problem with the error capture.
@mccarlosen only loading not working
I have seen that the blade view has too many external resources. Which is not good practice and very little that mpdf
could use.
Have you reviewed this critical note? Maybe you can try testing with a local web server. Readme
@mccarlosen Okay I will check in Live server, and try to remove external resource. And Many Many Thanks for co-operate with me
I'm having this error Illuminate\Foundation\Bootstrap\HandleExceptions::handleError C:\xampp\htdocs\fiamedical\vendor\mpdf\mpdf\src\Otl.php:154
and here's my controller
$pdf = MPDF::loadView('/printouts/salesagentreagents',array('data' => $data,'from' => $from,'to' => $to),[],[ 'margin_left'=> 35, 'margin_right'=> 15, 'default_font_size'=> '8', 'default_font'=> 'DejaVu Sans', 'format'=> 'Legal', 'orientation'=> 'L']);
return $pdf->stream();