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

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のオプションはお好みで変えてください。

参考ページ