spatie/laravel-pdf doesn't work on my remote server I like to get users the posibillity to generate pdf files from blade views so I searched the net and found spaties laravel-pdf.
I run composer require spatie/laravel-pdf and npm install puppeteer successfully on my local machine.
I have then written code where the user can generate pdf from a blade file and then download the pdf file. This works on my local machine.
I then push it to my remote server, so I first run composer run build and then push everything to my remote server.
When I then try to create a pdf the same way as I did locally, I get a 500 error in and in the log file, it says [2024-11-23 14:08:35] staging.ERROR: Call to undefined function Spatie\Browsershot\escapeshellarg() {"userId":1,"exception":"[object] (Error(code: 0): Call to undefined function Spatie\\Browsershot\\escapeshellarg() at /home/my-account/domains/my-project.se/laravel/vendor/spatie/browsershot/src/Browsershot.php:1144) [stacktrace]
Why do I get this error?
The error you're encountering, Call to undefined function Spatie\Browsershot\escapeshellarg(), suggests that the escapeshellarg() function is not available on your remote server. This function is a built-in PHP function, and its absence usually indicates that the PHP installation on your server is missing the necessary extension or configuration.
Here are some steps you can take to resolve this issue:
Check PHP Version and Extensions:
Ensure that your remote server is running a compatible version of PHP and that the necessary extensions are installed. The escapeshellarg() function is part of the standard PHP library, so it should be available if PHP is installed correctly.
You can check the PHP version and loaded extensions by creating a simple PHP file with the following content and accessing it via your browser:
<?php
phpinfo();
?>
Look for the disable_functions directive in the output. If escapeshellarg is listed there, it means the function is disabled.
Enable the Function:
If escapeshellarg is disabled, you will need to enable it. This can typically be done by editing the php.ini file on your server. Locate the disable_functions directive and remove escapeshellarg from the list. After making changes, restart your web server to apply them.
Verify Server Configuration:
Ensure that your server's PHP configuration is not overly restrictive. Some hosting environments disable certain functions for security reasons. If you're on shared hosting, you might need to contact your hosting provider to enable this function.
Alternative Solutions:
If you cannot enable escapeshellarg due to hosting restrictions, consider using a different package or approach for generating PDFs that does not rely on this function.
By following these steps, you should be able to resolve the issue and get the spatie/laravel-pdf package working on your remote server. If the problem persists, consider reaching out to your hosting provider for further assistance.
Now I have enabled escapeshellarg and I still get a 500 error, now with this message in log file:
[2024-11-23 15:03:48] staging.ERROR: The command "PATH=$PATH:/usr/local/bin:/opt/homebrew/bin NODE_PATH=`npm root -g` node '/home/my-place/domains/staging.my-app.se/laravel/vendor/spatie/browsershot/src/../bin/browser.cjs' '{"url":"file:\/\/\/tmp\/2005304953-0609033001732370628\/index.html","action":"pdf","options":{"args":[],"viewport":{"width":800,"height":600},"displayHeaderFooter":false,"format":"a4","printBackground":true}}'" failed.
Exit Code: 127(Command not found)
Working directory: /home/my-place/domains/staging.my-app.se/public_html
Output:
================
Error Output:
================
sh: npm: command not found
sh: node: command not found
{"userId":1,"exception":"[object] (Symfony\\Component\\Process\\Exception\\ProcessFailedException(code: 0): The command \"PATH=$PATH:/usr/local/bin:/opt/homebrew/bin NODE_PATH=`npm root -g` node '/home/my-place/domains/staging.my-app.se/laravel/vendor/spatie/browsershot/src/../bin/browser.cjs' '{\"url\":\"file:\\/\\/\\/tmp\\/2005304953-0609033001732370628\\/index.html\",\"action\":\"pdf\",\"options\":{\"args\":[],\"viewport\":{\"width\":800,\"height\":600},\"displayHeaderFooter\":false,\"format\":\"a4\",\"printBackground\":true}}'\" failed.
Exit Code: 127(Command not found)
Working directory: /home/my-place/domains/staging.my-app.se/public_html
Output:
================
Error Output:
================
sh: npm: command not found
sh: node: command not found
at /home/my-place/domains/staging.my-app.se/laravel/vendor/spatie/browsershot/src/Browsershot.php:1078)
[stacktrace]
#0 /home/my-place/domains/staging.my-app.se/laravel/vendor/spatie/browsershot/src/Browsershot.php(673): Spatie\\Browsershot\\Browsershot->callBrowser()
#1 /home/my-place/domains/staging.my-app.se/laravel/vendor/spatie/laravel-pdf/src/PdfBuilder.php(379): Spatie\\Browsershot\\Browsershot->pdf()
#2 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(902): Spatie\\LaravelPdf\\PdfBuilder->toResponse()
#3 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(887): Illuminate\\Routing\\Router::toResponse()
#4 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(807): Illuminate\\Routing\\Router->prepareResponse()
#5 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#6 /home/my-place/domains/staging.my-app.se/laravel/app/Http/Middleware/IsActive.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#7 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\IsActive->handle()
#8 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Auth/Middleware/EnsureEmailIsVerified.php(41): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#9 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Auth\\Middleware\\EnsureEmailIsVerified->handle()
#10 /home/my-place/domains/staging.my-app.se/laravel/app/Http/Middleware/Localization.php(24): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#11 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\Localization->handle()
#12 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(51): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#13 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#14 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(64): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#15 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Auth\\Middleware\\Authenticate->handle()
#16 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(88): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#17 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#18 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#19 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#20 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#21 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#22 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Session\\Middleware\\StartSession->handle()
#23 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#24 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#25 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(75): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#26 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#27 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#28 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(807): Illuminate\\Pipeline\\Pipeline->then()
#29 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(786): Illuminate\\Routing\\Router->runRouteWithinStack()
#30 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(750): Illuminate\\Routing\\Router->runRoute()
#31 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Routing/Router.php(739): Illuminate\\Routing\\Router->dispatchToRoute()
#32 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(201): Illuminate\\Routing\\Router->dispatch()
#33 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#34 /home/my-place/domains/staging.my-app.se/laravel/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#35 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware->handle()
#36 /home/my-place/domains/staging.my-app.se/laravel/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(59): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#37 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle()
#38 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#39 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#40 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#41 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#42 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(51): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#43 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#44 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#45 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
#46 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(110): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#47 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#48 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#49 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\HandleCors->handle()
#50 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(58): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#51 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#52 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#53 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\\Pipeline\\Pipeline->then()
#54 /home/my-place/domains/staging.my-app.se/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(145): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#55 /home/my-place/domains/staging.my-app.se/public_html/index.php(51): Illuminate\\Foundation\\Http\\Kernel->handle()
#56 {main}
"}
You can try this
pdf()->withBrowsershot(function (Browsershot $browserShot) {
$browserShot->setNodeBinary('PATH TO NODE');
$browserShot->setNpmBinary('PATH TO NPM');
});
@mateodioev Thanks, just installed dompdf. Now it is all working. Thanks for your effort anyway!
Please sign in or create an account to participate in this conversation.