Я хотел бы вставить PDF-файл на веб-страницу. Мне нужно динамически создать PDF, чтобы я мог сначала аутентифицировать пользователя, поэтому я использую XSendFile на Apache. PHP-файл, который у меня есть, работает нормально, когда я захожу в браузер, и PDF-файл сразу же предлагается для загрузки. Вот код, который я использую (любезно http://www.brighterlamp.com/2010/10/send-files-faster-better-with-php-mod_xsendfile/)
// Get a list of loaded Apache modules
$modules = apache_get_modules();
if (in_array('mod_xsendfile', $modules)) {
// Use XSendFile if possible
header ('X-Sendfile: ' . $pathToFile);
header ('Content-Type: ' . $documentMIME);
header ('Content-Disposition: attachment; filename="' . $actualFilename . '"');
exit;
} else {
// Otherwise, use the traditional PHP way..
header ('Content-Type: ' . $documentMIME);
header ('Content-Disposition: attachment; filename="' . $actualFilename . '"');
@ob_end_clean();
@ob_end_flush();
readfile($pathToFile);
exit;
}
Все идет нормально. Теперь я хочу встроить этот PDF-файл в веб-страницу, используя тег объекта, например:
<object data="dynamicpdf.php" type="application/pdf">
<p>PDF embed failed</a></p>
</object>
Но это не удается. Если я переключаю атрибут данных в статический PDF-файл, то он работает нормально.
Есть идеи, что не так?
Является ли iframing PDF вариант для вас?
подобно <iframe src="dynamicpdf.php">
Content-Disposition
заголовок заставляет загрузку. Убери это.
Генеральный совет:
Я бы не использовал такие функции, как apache_get_modules
что предполагает конкретную среду веб-сервера.
Что если вы в будущем переключитесь на mod_php или apache? Ваш код сломается.
Вместо этого я выполняю доставку в поточном php-ответе, который более эффективен по памяти, чем вывод, буферизующий весь PDF-файл в RAM, а затем отправляет его.
При потоковой передаче PDF с помощью PHP у вас также будет только одна реализация, и скорость будет такой же, как у x-sendfile:
Других решений пока нет …