views:

15

answers:

1

I have a php add which calls LaTeX then passes the PDF to the browser. Since my users will be paying for this service, I want to make sure they are given the option to save the PDF rather than hitting my server again and again.

exec("cd tex && latex {$_SESSION['sen_id']}.tex && pdflatex {$_SESSION['sen_id']}.tex", $output);
$pdf = substr($file,0,-3).'pdf';
if (file_exists($pdf)) {
  //header('Content-Description: File Transfer');
  header('Content-Type: application/pdf');
  //header('Content-Length: ' . filesize($pdf));
  header('Content-Disposition: attachment;filename='.date('Ymd-His').'-'.basename($pdf));
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: no-cache');
  header('Pragma: no-cache');
  ob_clean();
  flush();
  readfile($pdf);
  exit;
} else {
  echo '<h1>No PDF Produced</h1>';
  echo nl2br(print_r($output,true));
}

Using Wireshark, I have noticed that the Content-Disposition header is either not set or doesn't reach the client.

HTTP/1.1 200 OK\r\n
Date: Tue, 22 Jun 2010 14:15:10 GMT\r\n
Server: Apache/2.0.55 (Ubuntu) mod_jk/1.2.14 mod_python/3.1.4 Python/2.4.3 PHP/5.1.2 mod_ssl/2.0.55 OpenSSL/0.9.8a mod_perl/2.0.2 Perl/v5.8.7\r\n
X-Powered-By: PHP/5.1.2\r\n
Set-Cookie: SESS0d6c65b0599f5b70f6bbc50cfc5b2f94=2b23ba1f74f5f1f641365e9fbb45870d; expires=Thu, 15 Jul 2010 17:48:30 GMT; path=/; domain=.<domain removed>\r\n
Content-Transfer-Encoding: binary\r\n
Expires: 0\r\n
Cache-Control: no-cache\r\n
Pragma: no-cache\r\n
Connection: close\r\n
Transfer-Encoding: chunked\r\n
Content-Type: application/pdf\r\n
\r\n

So far, the tips I've found say "use octet-steam", "don't use octet-stream", "put spaces after the colons", "Capitalise each word" and "wrap the filename in quotes". I guess there's a lot of misinformation put out by people who got lucky.

+1  A: 

I don't know why the header's being stripped, but this page describes how you can encode the file name in the content disposition header and its implications for browser interoperability.

In these cases, I settled for the solution I wrote in the PHP manual page here (see the first example).

In your case, you're using an invalid header, which, however, should work with all the major browsers.

Artefacto