Чи є спосіб змусити 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 з коду на стороні сервера: ваша мова програмування на стороні сервера).
Якщо ви використовуєте HTML5 (і, напевно, зараз усі користуються цим), є атрибут, який називається download
.
Наприклад,
<a href="somepathto.pdf" download="filename">
Тут filename
необов’язково, але якщо воно передбачено, воно буде приймати це ім'я для завантаженого файлу.
Правильний тип application/pdf
для PDF, а не application/force-download
. Це виглядає як злом для деяких застарілих браузерів. Завжди використовуйте правильний міметик, якщо можете.
Якщо у вас є контроль над кодом сервера:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
Немає контролю над кодом сервера:
ПРИМІТКА. Я вважаю за краще встановити ім'я файлу на стороні сервера, оскільки у вас може бути більше інформації та ви можете використовувати загальний код.
Якщо у вас є Apache, додайте це у .htaccess
файл:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
На жаль, у моєму попередньому дописі були помилки введення тексту.
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
Якщо ви не хочете, щоб браузер спонукав користувача, тоді використовуйте "вбудований" для третього рядка замість "вкладення". Inline працює дуже добре. Дисплей PDF негайно, не вимагаючи від користувача натиснути на Відкрити. Я використовував "вкладення", і це підкаже користувача для відкриття, збереження. Я намагався змінити гайку налаштувань браузера, це не заважає запиту.
Це для 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");
}
Хоча наступне працює добре на firefox, воно НЕ працює в хромованих та мобільних браузерах.
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 з rootfile.
Потім перейдіть до рядка 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>
Але тепер дозвольте лише певні необхідні файли.
Я використовував цей код, і він прекрасно працював.
Або використовувати
<embed src="file.pdf" />
якщо вбудовування - це варіант або мій новий плагін, PIFF: https://github.com/terrasoftlabs/piff
Ось ще один спосіб змусити файл переглядати в браузері на 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-документ)
Просто відкрийте Adobe Reader, меню → Редагувати → Налаштування → Інтернет , а потім перейдіть до режиму браузера або для отримання детальних інструкцій у різних браузерах спробуйте Показати PDF у браузері | Acrobat, Acrobat Reader .
Якщо ви посилаєтесь на .PDF, він відкриється у браузері.
Якщо це поле не встановлено, воно повинно посилатися на .zip, щоб примусити завантаження.
Якщо .zip не є варіантом, тоді використовуйте заголовки в PHP для примусового завантаження
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');