ははっ、わかるわかる

思ったこと書いてく

【PHP】 TCPDFで作成したPDFをサーバーに保存する方法

通常TCPDFでファイル保存する場合は、Outputの第一引数にファイルパスを、第二引数に'F'を指定します。

$filePath = "/home/hogehoge/test.pdf";
$pdf->Output($filePath, 'F');

しかしこのままだとサーバー上(/home/hogehoge/test.pdf)などに保存しようとした場合に

Warning: fopen(file:///home/hogehoge/test.pdf):...
TCPDF ERROR: Unable to create output file: /home/hogehoge/test.pdf

このようなエラーが発生します。

ん?なんで「file://」がついてるんだ??

どうやらOutputのF指定は「file://」が勝手につけられるようです。

まあこの'F'は元々ローカルファイルとして保存を目的としているので「file://」がつくのはしかたない。

とは言ってられないので、tcpdf.phpのソースを見てみます。

どうやらTCPDF_STATIC::fopenLocalでエラーが発生しているようです。

ということで該当のソースを見てみます。

include/tcpdf_static.php内にあるfopenLocal関数をみてみます。

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

これですね。

ファイル名に「file://」がないと強制で付与されています。

ここをまるっとコメントアウトしましょう。

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

これでOKです。

変更後、もう一度OutputをF指定で試してみると無事サーバーの指定ディレクトリにpdfが作成できました。