在浏览器中打开 PDF 而不是下载它

Posted

技术标签:

【中文标题】在浏览器中打开 PDF 而不是下载它【英文标题】:Opening a PDF in browser instead of downloading it 【发布时间】:2012-08-18 15:44:05 【问题描述】:

我正在使用 iTextSharp 在单击按钮时将面板打印到 PDF 中。单击按钮后,PDF 正在下载到客户的计算机上。而不是这个,我需要在浏览器中打开 PDF 而不是下载。用户可以通过浏览器将 PDF 下载到他的 PC。

我正在使用以下代码:

Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter sw = new StringWriter();
htmlTextWriter hw = new HtmlTextWriter(sw);
pnl_print.RenderControl(hw);

StringReader sr = new StringReader(sw.ToString());
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0f);
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close();
Response.Write(pdfDoc);
Response.End();

sr.Close();
hw.Close();
sw.Close();

【问题讨论】:

【参考方案1】:

content-disposition 更改为inline 而不是attachment

你的 sn-p 的第二行将是

Response.AddHeader("content-disposition", "inline;filename=" + filename + ".pdf");

更多详情请参阅Content-Disposition:What are the differences between "inline" and "attachment"?。

【讨论】:

谢谢它帮助了我。你能帮我吗? applying-styles-in-pdf-gridview-using-itextsharp @KrishnaThota 我很乐意,但不幸的是我没有那个答案。 面板内有一个标签,我将其制作为 PDF,但标签未在 PDF 中显示,您能帮帮我吗? 如何在新选项卡中打开 Pdf 文件,而不是在同一个选项卡中打开它? 正如另一个答案中提到的,为了在另一个选项卡/窗口中打开 PDF,您必须将链接的目标设置为 "_blank"【参考方案2】:

试试这个代码:

行动:

Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");

在新标签/窗口中打开:

@Html.ActionLink("view pdf", "getpdf", "somecontroller", null, 
                  new  target = "_blank" )

<a href="GeneratePdf.ashx?somekey=10" target="_blank">

【讨论】:

content-dispositon 不应该是inline吗? 我应该在哪里写@Html。东西? 我使用的是 asp:image 按钮而不是 &lt;a/&gt; 标签 你必须像这样使用anchor tag &lt;a&gt;&lt;img /&gt;&lt;/a&gt; 的asp 的insted 图像按钮 我没接你href="GeneratePdf.ashx?somekey=10" 这是什么行?我不是从 ashx 文件生成 pdf 的!我正在从同一页面生成 pdf【参考方案3】:

您应该查看“Content-Disposition”标头;例如,将“Content-Disposition”设置为“attachment;filename=FileName.pdf”将提示用户(通常)使用“另存为:FileName.pdf”对话框,而不是打开它。但是,这需要来自执行下载的请求,因此您不能在重定向期间执行此操作。但是,ASP.NET 为此目的提供了 Response.TransmitFile。例如(假设您没有使用 MVC,它还有其他首选选项):

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=FileName.pdf");
Response.TransmitFile(Server.MapPath("~/folder/Sample.pdf"));
Response.End(); 

如果你尝试打开那么 apicontroller 中的文件将流转换为字节数组然后填充内容

HttpResponseMessage result = null;
result = Request.CreateResponse(HttpStatusCode.OK);
FileStream stream = File.OpenRead(path);
byte[] fileBytes = new byte[stream.Length];
stream.Read(fileBytes, 0, fileBytes.Length);
stream.Close();           
result.Content = new ByteArrayContent(fileBytes);
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "FileName.pdf";            

我想它会帮助你...

【讨论】:

以上是关于在浏览器中打开 PDF 而不是下载它的主要内容,如果未能解决你的问题,请参考以下文章

强制浏览器下载 PDF 文档而不是打开它

Flutter Web:从 URL 下载文件而不打开它

在浏览器中打开文件而不是下载它

怎样让 pdf 文件直接下载而非在浏览器里打开

Android 使用 php 在浏览器中打开 pdf 文件

Python 文件在浏览器窗口中打开,而不是下载提示