Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mPDF temporary file is not writable using Yii

Tags:

php

yii

mpdf

I tried to print a certificate in PDF but when I push my code to staging, it said

Temporary files directory "/var/www/protected/vendor/mpdf/mpdf/src/Config/../../tmp" is not writable

I'm not sure how to change the permission and how to change the custom directory.

Here's my code of a button to click to get the certificate:

 <a class="btn btn-sd btn-sd-ghost btn-sd-ghost-black margin-right-lg" href="<?php echo $this->createUrl('//idea/frontend/pdf', array('id'=>$model->id))?>" target="_blank">Get Your Certificate<i class="icon-right-small"></i></a> 
            <?php endif; ?>

and this is the controller:

public function actionPdf($id){
        $model = HUB::getOrganization($id);
        $orgtitle = $model->title;

        $mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4-L']);
        $mpdf->WriteHTML("<html><body style='background-image:url(\"/images/cert-idea.jpg\"); background-image-resize: 5; background-position: top center;'></body></html>");

        $mpdf->WriteHTML("<div style='text-align:center; display:table; height:100%; width:100%; padding-top:28%;'><h1 style='display:table-cell; vertical-align:middle; font-size:40px;'>".$orgtitle."</h1></div>");


        $mpdf->Output('IDEA-CERT-'.$orgtitle.'.pdf', 'I');
    }

Hope someone can help on my issue. Thank you!

like image 707
rryys Avatar asked Feb 01 '18 02:02

rryys


3 Answers

Try a custom temporary directory as stated in the documentation:

It is recommended to set custom temporary directory via tempDir configuration key. The directory must have write permissions (mode 775 is recommended).

<?php
$mpdf = new \Mpdf\Mpdf(['tempDir' => __DIR__ . '/custom/temp/dir/path']);

You will have far more control over permissions of a directory outside composer vendor-dir.

Mode 775 may not be sufficient if a web-server user, typically www-data has to access the directory. Use 777 if necessary.

Be warned that mPDF auto-cleans its temporary directory, so use one dedicated only to mPDF.

like image 80
Finwe Avatar answered Nov 12 '22 23:11

Finwe


You can change the file permission with:
chmod 777 /var/www/protected/vendor/mpdf/mpdf/tmp
but that would allow anyone on that computer any type of access to that file, so probably not a good idea. It would give you a starting point though, if this works you know that the problem is file permissions.

You may need to run it as super-user if you are not the owner of that file

A better solution would be to change the owner to be the process that the server runs on,
chown www-data: /var/www/protected/vendor/mpdf/mpdf/tmp
changing www-data for the process that will save the file.

It is strange that is trying to save the pdf to that directory though, are you using Kartik's mPDF? The default configuration is to send the file inline to the browser, it should only be trying to save the file if you changed the configuration, either globally or when you create the widget, to:

'destination' => ['Pdf::DEST_FILE', '../../tmp']

If that is the case then the best would be to configure that to whichever option you need, probably Pdf::DEST_BROWSER (default) or Pdf::DEST_DOWNLOAD to force a download without prompting the user.

Saving the pdf as a file inside the directory where the application is doesn't really make sense unless you only ever plan to use your developing computer as a client, there is no way to tell what other client's folder structures will look like so it is much better to let their browsers decide what to do with the file.

like image 9
Raul Sauco Avatar answered Nov 13 '22 00:11

Raul Sauco


It is essential to provide writable temporary directory. Best solution is to use OS provided temporary space.

$mpdf = new \Mpdf\Mpdf(['tempDir' => sys_get_temp_dir().DIRECTORY_SEPARATOR.'mpdf']);
like image 7
Kapil Bhagchandani Avatar answered Nov 13 '22 01:11

Kapil Bhagchandani