PHPでwkhtmltopdfをオンメモリで使う

kensuke-iizuka 213views 更新:2016年12月21日

proc_openを用いることで生成されるPDFを標準入出力のパイプ処理によってメモリ上のみで処理する事ができます。

これによって、例えばtmpフォルダに保存しなくて良いので実行速度の向上、ハードディスクの容量を圧迫することの阻止ができます。

以下がそのコードです。

全体の概要としては、

1.PDFにしたいページのURLからHTMLを取得して標準入力に入れる

2.標準出力へそのHTMLを変換したPDFを出す。

3.変換したPDFをブラウザでダウンロードする

という流れになっています。

function generate_pdf()
{
  $descriptorspec = array(
    0 => array('pipe', 'r'), // stdin
    1 => array('pipe', 'w'), // stdout
    2 => array('pipe', 'w'), // stderr
  );

  //get HTML from URL
  $html =file_get_contents($site_url);

  //execute wkhtmltopdf
  $process = proc_open("wkhtmltopdf --q - -", $descriptorspec, $pipes);

  // Send the HTML on stdin
  fwrite($pipes[0], $html);
  fclose($pipes[0]);

  // Read the outputs
  $pdf = stream_get_contents($pipes[1]);
  fclose($pipes[1]);

  //close process
  $return_value = proc_close($process);

  // Output the results
  header('Content-Type: application/pdf');
  header('Cache-Control: public, must-revalidate, max-age=0');
  header('Pragma: public');
  header('Expires: 0');
  header('Last-Modified: ' . gmdate('D, d M Y H:i:s').' GMT');
  header('Content-Disposition: attachment; filename="paper.pdf";');

  echo $pdf;

}

$site_urlに適切なURLを入力すればPDFを出力してくれます。HTTPヘッダとwkhtmltopdfのオプションはお好みで変えてください。

参考ページ

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません