Когда вы меняете некоторые заголовки, вы должны сделать это перед любым выводом, потому что заголовок должен быть отправлен в начале, например:
Это недопустимо:
echo 'Test';
header('Content-Description: File Transfer');
Thats не ваш случай, но вы делаете аналогичную ошибку на другом конце.
Когда вы печатаете данные файла, например, как вы это делаете в своем вопросе, нет функции, которая сообщала бы, что «ваши данные заканчиваются здесь », в качестве файла принимается только весь вывод.
Если вы не можете отделить передачу файла от другого вывода, есть простое решение, попробуйте его:
if (isset($filename)) {
header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="'.basename($filename).'"');//set content-disposition as "inline" as opposed to "attachment" so that it opens first in the browser
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
echo base64_decode($pdf_file);
exit(); // nothing else will happen, no website which is shown otherwise
}