Я бы использовал ajax в этом случае. но если отсутствие JS вызывает у вас серьезную озабоченность, есть несколько способов сделать это без JS.
Сначала вы можете отобразить что-то для пользователя перед началом работы с PDF. например,
<?php
echo "<html><head></head><body> Please Wait..";
flush();
// process pdf here
?>
Функция flush () заставит веб-сервер отправлять данные в браузер, поэтому они будут отображаться, пока загружена остальная часть страницы. Однако некоторые браузеры кешируют эту вещь внутренне. Есть способы преодолеть это (посмотрите комментарии в php.net для функции flush ()), но это может запутаться.
Другой способ - асинхронная обработка PDF. В этом случае целевой скрипт просто отображает сообщение о том, что электронная почта будет отправлена в ближайшее время. И запускает сценарий, который фактически собирается отправить. например:
<?php
echo "<html><head></head><body> Email will be send out shortly </body></html>";
$params='';
foreach ($_POST as $name => $value) {
$params.=$name.'='.$value.'&';
}
if ($params!='')
$params=urldecode(substr($params,0,-1));
$parts=parse_url('process_pdf.php'.'?'.$params);
$fp = fsockopen('process_pdf.php',80, $errno, $errstr, 30);
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: application/x-www-form-urlencoded\r\n";
$out.= "Content-Length: ".strlen($parts['query'])."\r\n";
$out.= "Connection: Close\r\n\r\n";
$out.= $parts['query'];
fwrite($fp, $out);
fclose($fp);
?>
в этом примере «process_pdf.php» получит все те же параметры POST, что и оригинальный скрипт. но будет выполняться в фоновом режиме, не прерывая исходную страницу.