Есть ли способ заставить PDF-файлы открываться в браузере, если флажок «Показать PDF-файл в браузере» не установлен?
Я пробовал использовать тег embed и iframe, но он работает, только если этот параметр отмечен.
Что я могу сделать?
Есть ли способ заставить PDF-файлы открываться в браузере, если флажок «Показать PDF-файл в браузере» не установлен?
Я пробовал использовать тег embed и iframe, но он работает, только если этот параметр отмечен.
Что я могу сделать?
Чтобы указать браузеру, что файл следует просмотреть в браузере, ответ HTTP должен включать следующие заголовки:
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Чтобы файл загружался, а не просматривался:
Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"
Кавычки вокруг имени файла необходимы, если имя файла содержит специальные символы, такие как filename[1].pdf, которые в противном случае могут нарушить способность браузера обрабатывать ответ.
То, как вы устанавливаете заголовки HTTP-ответа, будет зависеть от вашего HTTP-сервера (или, если вы генерируете PDF-ответ из серверного кода: вашего серверного языка программирования).
<embed src="{presigned_s3_url}" />
- person Julian; 20.11.2020
Content-Disposition: inline; здесь значением по умолчанию для этого заголовка? если нет, что произойдет, если я установлю тип содержимого как application / pdf, без заголовка content-disposition?
- person Kevin Chandra; 14.07.2021
Если вы используете HTML5 (и я думаю, что в настоящее время его используют все), есть атрибут с именем download.
Например,
<a href="somepathto.pdf" download="filename">
Здесь filename не является обязательным, но если он указан, он будет принимать это имя для загруженного файла.
Правильный тип - application/pdf для PDF, а не application/force-download. Это похоже на взлом некоторых устаревших браузеров. По возможности всегда используйте правильный mimetype.
Если вы контролируете код сервера:
header("Content-Disposition", "attachment; filename=myfilename.myextension");header("Content-Disposition", "inline; filename=myfilename.myextension");Нет контроля над серверным кодом:
ПРИМЕЧАНИЕ. Я предпочитаю устанавливать имя файла на стороне сервера, поскольку у вас может быть больше информации и вы можете использовать общий код.
К сожалению, в моем предыдущем посте были опечатки.
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
Если вы не хотите, чтобы браузер выводил подсказку пользователю, используйте «inline» для третьей строки вместо «attachment». Встроенный работает очень хорошо. PDF-файл отображается сразу же, не предлагая пользователю нажать кнопку «Открыть». Я использовал «вложение», и это предложит пользователю «Открыть», «Сохранить». Я попытался изменить настройки браузера, это не мешает отображать подсказку.
Если у вас есть Apache, добавьте это в .htaccess файл:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Это для ASP.NET MVC
На вашей странице cshtml:
<section>
<h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
<object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
<h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
</object>
</section>
В вашем контроллере:
public ActionResult Download(Guid id)
{
if (id == Guid.Empty)
return null;
var model = GetModel(id);
return File(model.FilePath, "application/pdf", model.FileName);
}
public FileStreamResult View(Guid id)
{
if (id == Guid.Empty)
return null;
var model = GetModel(id);
FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);
return File(fs, "application/pdf");
}
У меня возникла такая же проблема, и большинство из приведенных выше ответов должны решить вашу проблему. К сожалению, даже если я получал в ответе заголовки content-type и content-disposition, но все равно мой PDF-файл загружался, а не просматривался. После мозгового штурма и многочасовых попыток.
Виновником был firefox, в некотором смысле это был я. Нервный смех
По умолчанию, когда вы открываете PDF-файл в firefox, появляется всплывающее окно, в котором вы можете сохранить файл PDF или открыть его напрямую strong > и есть также флажок, который говорит с этого момента выполнить это действие автоматически и угадайте, кто его выбрал.
Из-за этой ошибки мой PDF-файл загружался, а не просматривался, даже если в ответе были все необходимые заголовки. Это простая ошибка, но стоила мне много времени.
Чтобы решить эту проблему, просто перейдите в настройки и найдите приложения и измените настройки PDF на все, что вам нужно.
Следующее работает хорошо в firefox, но НЕ работает в браузерах Chrome и мобильных устройствах.
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Чтобы исправить ошибку Chrome и мобильных браузеров, сделайте следующее:
Google PDF Viewer можно использовать так:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
Откройте файл downloads.php из корневого файла.
Затем перейдите к строке 186 и измените ее на следующее:
if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
$mime = getimagesize($download_location);
if(!empty($mime)) {
header("Content-Type: {$mime['mime']}");
}
}
elseif(preg_match("/\.pdf/i", $name)){
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
}
else{
header("Content-Type: application/force-download");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$name."\";");
}
Сделать это можно следующим образом:
<a href="path to PDF file">Open PDF</a>
Если файл PDF находится внутри какой-либо папки и эта папка не имеет разрешения на доступ к файлам в этой папке напрямую, вам необходимо обойти некоторые ограничения доступа к файлам, используя параметр .htaccess файла следующим образом:
<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
Order Allow,Deny
Allow from all
</FilesMatch>
Но теперь разрешите только определенные необходимые файлы.
Я использовал этот код, и он отлично работал.
Вот еще один метод принудительного просмотра файла в браузере в PHP:
$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
echo '<html>'
.header('Content-Type: application/'.$extension).'<br>'
.header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
.'<body>'
.'<object style="overflow: hidden; height: 100%;
width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
<embed src="'.$url.'" type="application/'.$extension.'" />
</object>'
.'</body>'
. '</html>';
header не работает после того, как вы начали выводить тело запроса (и он не возвращает строку для конкатенации в документе HTML)
- person Quentin; 28.08.2019
Либо используйте
<embed src="file.pdf" />
если встраивание - вариант или мой новый плагин, PIFF: https://github.com/terrasoftlabs/piff
Просто откройте Adobe Reader, выберите меню → Редактировать → Настройки → Интернет, затем перейдите в режим браузера или для получения подробных инструкций в разных браузерах попробуйте Отображать PDF в браузере | Acrobat, Acrobat Reader.
Если вы создадите ссылку на .PDF, он откроется в браузере.
Если флажок не установлен, он должен ссылаться на .zip для принудительной загрузки.
Если .zip не подходит, используйте заголовки в PHP, чтобы заставить скачать
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');