Oops, I screwed up the order a little bit. Adding the Content-transfer-encoding header always helps too.
I tested this out locally and it worked fine.
<?php
//$attachment = (strstr($HTTP_USER_AGENT, "MSIE")) ? "" : " attachment"; // IE 5.5 fix.
$file = "bg.pdf";
header("Cache-control: private"); // another fix for IE
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=bg.pdf");
header("Content-transfer-encoding: binary");
header("Content-length: " . filesize($file));
$hd = fopen($file,"rb");
fpassthru($hd);
?>