h404("missing url"); } require_once 'System.php'; $timeout= System::which('timeout'); if (empty($timeout)) { $this->h404("missing timeout"); } $xvfb = System::which('xvfb-run'); if (empty($xvfb)) { $this->h404("missing xvfb"); } $webkitpdf = System::which('webkitpdf'); if (empty($webkitpdf )) { $this->h404("missing webkitpdf (compile it..)"); } // max delay 20 seconds.? bit generous.. $delay = empty($_REQUEST['delay']) ? 1 : max(20,$_REQUEST['delay']); //?? allow injections? // not yet.. $outpr = tempnam(ini_get('session.save_path'), 'webkitTMP'); unlink($outpr); $out = $outpr .'.pdf'; // can take 2-5 minutes... $cmd = "timeout 300s $xvfb --auto-servernum $webkitpdf " . " --url " . escapeshellarg($_REQUEST['url']) . ' ' . " --pdf " . $out . ' '; $res = `$cmd`; if (!file_exists($out)) { $this->h404("Failed to create file $cmd ==> $res"); } header('Content-type: application/octet-stream'); header("Expires: "); header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); header("Pragma: public"); header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT"); //header('Content-length: '. filesize($out)); header('Content-Disposition: attachment; filename="' . htmlspecialchars(basename($out)). '"'); ini_set('display_errors', 0); $fh = fopen($out, 'rb'); fpassthru($fh); fclose($fh); unlink($out); exit; } function h404($msg) { header("HTTP/1.0 404 Not Found"); echo htmlspecialchars($msg); exit; } }