Existe uma maneira de forçar a abertura de arquivos PDF no navegador quando a opção "Exibir PDF no navegador" está desmarcada?
Tentei usar a tag embed e um iframe, mas ele só funciona quando essa opção está marcada.
O que eu posso fazer?
Existe uma maneira de forçar a abertura de arquivos PDF no navegador quando a opção "Exibir PDF no navegador" está desmarcada?
Tentei usar a tag embed e um iframe, mas ele só funciona quando essa opção está marcada.
O que eu posso fazer?
Respostas:
Para indicar ao navegador que o arquivo deve ser exibido no navegador, a resposta HTTP deve incluir estes cabeçalhos:
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Para que o arquivo seja baixado em vez de visualizado:
Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"
As aspas ao redor do nome do arquivo serão necessárias se o nome do arquivo contiver caracteres especiais, como os filename[1].pdf
que de outra forma podem prejudicar a capacidade do navegador de lidar com a resposta.
Como você define os cabeçalhos de resposta HTTP dependerá do seu servidor HTTP (ou, se você estiver gerando a resposta em PDF a partir do código do servidor: sua linguagem de programação do servidor).
Se você estiver usando HTML5 (e eu acho que hoje em dia todo mundo usa isso), há um atributo chamado download
.
Por exemplo,
<a href="somepathto.pdf" download="filename">
Aqui filename
é opcional, mas se fornecido, esse nome será usado para o arquivo baixado.
O tipo correto é application/pdf
para PDF, não application/force-download
. Parece um hack para alguns navegadores herdados. Sempre use o tipo correto de mimet, se puder.
Se você tiver controle sobre o código do servidor:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
Sem controle sobre o código do servidor:
NOTA: Prefiro definir o nome do arquivo no servidor, pois você pode ter mais informações e usar código comum.
Se você possui o Apache, adicione-o ao .htaccess
arquivo:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Ups! Ocorreram erros de digitação na minha postagem anterior.
header("Content-Type: application/force-download");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=\"".$name."\";");
Se você não deseja que o navegador solicite ao usuário, use "inline" para a terceira string em vez de "anexo". Inline funciona muito bem. O PDF é exibido imediatamente sem solicitar ao usuário que clique em Abrir. Eu usei "anexo" e isso solicitará ao usuário Abrir, Salvar. Tentei alterar a porca de configuração do navegador, mas isso não impede o prompt.
Isto é para o ASP.NET MVC
Na sua página 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>
No seu controlador:
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");
}
Embora o seguinte funcione bem no Firefox, ele NÃO funciona nos navegadores Chrome e Mobile.
Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"
Para corrigir o erro do Chrome e dos navegadores móveis, faça o seguinte:
O Google PDF Viewer pode ser usado da seguinte maneira:
<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
Abra o downloads.php no arquivo raiz.
Em seguida, vá para a linha 186 e altere-a para o seguinte:
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."\";");
}
Você pode fazer isso da seguinte maneira:
<a href="path to PDF file">Open PDF</a>
Se o arquivo PDF estiver dentro de alguma pasta e essa pasta não tiver permissão para acessar arquivos nessa pasta diretamente, você precisará ignorar algumas restrições de acesso a .htaccess
arquivos usando a configuração de arquivos desta maneira:
<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
Order Allow,Deny
Allow from all
</FilesMatch>
Mas agora permita apenas alguns arquivos necessários.
Eu usei esse código e ele funcionou perfeitamente.
Qualquer uso
<embed src="file.pdf" />
se a incorporação for uma opção ou meu novo plug-in, PIFF: https://github.com/terrasoftlabs/piff
Aqui está outro método de forçar a visualização de um arquivo no navegador em 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
não funciona depois que você começou a produzir o corpo da solicitação (e não retorna um string para concatenar em um documento HTML)
Basta abrir o Adobe Reader, menu → Editar → Preferências → Internet e , em seguida, mudar para o modo navegador ou para obter instruções detalhadas sobre diferentes navegadores, tente Exibir PDF no navegador | Acrobat, Acrobat Reader .
Se você vincular a um arquivo .PDF, ele será aberto no navegador.
Se a caixa estiver desmarcada, ela deve ser vinculada a um .zip para forçar o download.
Se um .zip não for uma opção, use os cabeçalhos no PHP para forçar o download
header('Content-Type: application/force-download');
header('Content-Description: File Transfer');