Linga
Linga

Reputation: 10573

TCPDF ERROR: Unable to create output file

I'm trying to generate pdf with the combination of TCPDF and FPDI. Here is my code.

require_once('../tcpdf/tcpdf.php');
require_once('../FPDI/fpdi.php');

$fileName = '../sample.pdf';

class PDF extends FPDI {
/**
 * "Remembers" the template id of the imported page
 */
var $_tplIdx;
var $numPages = 0;

/**
 * Draw an imported PDF logo on every page
 */
function Header() {

    global $fileName;

    if (is_null($this->_tplIdx)) {
        $this->setSourceFile($fileName);
        $this->_tplIdx = $this->importPage(1);
        $this->numPages = $this->setSourceFile($fileName);
    }
    $size = $this->useTemplate($this->_tplIdx);
}

function Footer() {
    // emtpy method body
}
}

// initiate PDF
$pdf = new PDF($fileName);
$pdf->setFontSubsetting(true);

// add a page
$pdf->AddPage();

// save file
$pdf->Output('output.pdf', 'F');

Here, the last line $pdf->Output('output.pdf', 'F'); is for saving the file. But it is not working. When I was having only $pdf->Output(), it was showing the pdf in browser.

I've tried $pdf->Output('output.pdf', 'D'); for downloading and it worked fine. Seems $pdf->Output('output.pdf', 'F'); is only not working and it shown an error TCPDF ERROR: Unable to create output file: output.pdf.

Note: there is no file permission issues

Can anyone point out the issue please.

Upvotes: 9

Views: 81889

Answers (13)

Rasalas
Rasalas

Reputation: 1562

Since this cost me like an hour:
Make sure the folder exists and that you use the full path to the file.

TCPDF doesn't seem to create folders.

$year = date('Y');
$folder = __DIR__ . "/../invoices/$date";

if (!is_dir($folder)) {
    mkdir($folder, 0777, true);
}

$pdf->Output("$folder/output.pdf", 'F');

Upvotes: 0

Angel Albinagorta
Angel Albinagorta

Reputation: 21

en Output cambiar de :

 $f = TCPDF_STATIC::fopenLocal($name, 'wb');

a:

$f = fopen($name, 'wb');

Upvotes: 0

Lin
Lin

Reputation: 1

I having the same issue, but for my case to solve this following issue was declare the system temporary directory on XAMPP.

sys_temp_dir = /Applications/XAMPP/xamppfiles/temp/

Upvotes: 0

earnest ji
earnest ji

Reputation: 1

Maybe your file was opened by another application

Upvotes: -2

Chinmay235
Chinmay235

Reputation: 3414

Give your directory permission where you want to store your output.pdf file

chmod -R 0777 /yourdirectory

Upvotes: 1

Divyesh Jesadiya
Divyesh Jesadiya

Reputation: 907

make sure that file sample.pdf is not open anywhere when you run script. if it's open somewhere else then TCPDF can't open it.

Upvotes: 0

Mike Craig
Mike Craig

Reputation: 39

I found that this error was also caused by too many images. I was trying to create a PDF with 186 images and got this error. I tried all the options above and still got this error. I then reducing the images (and did a test with 100 images) PDF created ok. Increase the number of images again and got the error again.

Upvotes: 1

Charaf JRA
Charaf JRA

Reputation: 8334

You have to put the full path instead of relative one, example of usage with__DIR__:

 $pdf->Output(__DIR__."/../invoices/invoice_".date('d-M-Y').".pdf", 'F');

Upvotes: 7

harrrrrrry
harrrrrrry

Reputation: 14507

the issue is caused by file's path. I get this fixed by changing $pdf->Output('output.pdf', 'F'); to absolute path $pdf->Output('/var/www/yourdomain/output.pdf', 'F');

Upvotes: 5

Syed Amir Bukhari
Syed Amir Bukhari

Reputation: 136

Check the folder permissions as well. Because i have the same issue and i resolve it by changing the folder permissions.

Upvotes: 0

mostafaznv
mostafaznv

Reputation: 988

this is a tip for laravel programmers who using tcpdf if you want to save pdf to your public directory, just use this:

PDF::Output(public_path('/uploads/pdf/hello_world.pdf'),'F');

Upvotes: 5

Atul Baraiya
Atul Baraiya

Reputation: 159

In the 'include/tcpdf_static.php' file about 2435 line in the static function 'fopenLocal' if I delete the complete 'if statement'... works fine.

public static function fopenLocal($filename, $mode) {
    /*if (strpos($filename, '://') === false) {
        $filename = 'file://'.$filename;
    } elseif (strpos($filename, 'file://') !== 0) {
        return false;
    }*/
    return fopen($filename, $mode);
}

Upvotes: 9

Puya Sarmidani
Puya Sarmidani

Reputation: 319

Try putting ob_clean(); right above $pdf->Output('output.pdf', 'F');

ob_clean();

// save file
$pdf->Output('output.pdf', 'F');

if that dont work. Than you need to set a path like this:

$pdf->Output('yourpath/output.pdf', 'F');

if you dont know the absolute path try this:

$pdf->Output($_SERVER['DOCUMENT_ROOT'] . 'output.pdf', 'F');

Upvotes: 26

Related Questions