SHINY DEVIL

[PHP] TCPDFで生成したPDFを日本語ファイル名でダウンロード

ネタとしてはちょっと古いです。

TCPDFでPDFファイルを作成していていつも思っていたのが、

  • ブラウザで開かずダウンロードもしくは規定のアプリで表示したい
  • ファイル名に日本語を使いたい

の2点。

ブラウザでPDFを開いて印刷しようとすると、縦横が合わなかったり、変に縮小されてしまったりして不便。どうせならダウンロードしてしまうか、規定のアプリで表示させたい。

そして、ダウンロードするなら、デフォルトのファイル名を自由に設定し、できれば日本語を使いたい。

そんな悩みが、以下のように記述することで意外と簡単に解決できるのでメモメモ。初期設定やページ準備は自分がいつも使っているテンプレート的なもの。

// PDF出力のための初期設定
$pdf = new TCPDF( 'P', 'mm', 'A4', true, 'UTF-8' ); // 縦:P 横:L
$pdf->setPrintHeader( false );
$pdf->setPrintFooter( false );
$pdf->SetLineWidth( 0.15 );

// 1ページ目を準備
$pdf->AddPage();
$pdf->SetMargins( 0, 0, true );
$pdf->SetAutoPageBreak( false );

// PDFに出力する処理




// PDFファイル名を生成
$filename = date( 'Ymd' )."_日本語も使えるよ.pdf";
$filename = mb_convert_encoding( $filename, 'SJIS-WIN', 'UTF-8' );

// PDF出力
$pdf_output = $pdf->Output( $filename, "S" );

header( "Pragma: public" );
header( "Expires: 0 ");
header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
header( "Content-Transfer-Encoding: binary" );
header( "Content-Type: application/octet-streams" );
header( "Content-Disposition: attachment; filename=\"{$filename}\"" );
print $pdf_output;
exit;

$pdf->Output の第二引数に"S"を指定するところがキーポイントですかね。第二引数は以下のいずれかが指定できる。

"S":PDFの内容を文字列で出力
"I":ブラウザに出力(既定値)
"F":ローカルファイルとして保存
"D":ブラウザでダウンロード(強制)

いずれの指定もファイル名の日本語がうまく設定されず、結局"S"を指定してヘッダから作ってあげてうまくいった、というお話。

だいぶ前から使っている古いネタなので、今はもっといい方法があるかも?

スポンサーリンク

この記事をシェア

アカウントをフォロー