在新页面中打开 PDF
本文关键字:PDF 新页面 | 更新日期: 2023-09-27 18:31:29
>我已经创建了一个PDF,我正在尝试在新窗口(或新选项卡,但我现在有新窗口工作)中打开它
这是我的aspx代码。链接按钮位于 GridView 中,该 GridView 位于面板中,该面板位于更新面板中(是的,我见过人们在更新面板和这个方面遇到问题,但我必须这样做)。
<ItemTemplate>
<asp:LinkButton ID="ReportLink" runat="server" CommandName="GenReport"
CommandArgument='<%# Container.DataItemIndex %>'
OnClientClick="LoadPDF()" PostBackUrl="~/Indices/myPDF.aspx"
Text="View Report" ToolTip="Genereate a PDF of the Report"></asp:LinkButton>
</ItemTemplate>
这是我打开新窗口的javascript
function LoadPDF() {
window.open('myPDF.aspx', '',
'scrollbars=no,menubar=no,height=600,width=800,resizable=yes,toolbar=no,location=no,status=no');
}
这是 C#。第一个片段是单击链接按钮时调用的内容(在javascript之后)。第二种是实际创建PDF并尝试将其发送到新窗口的方法。
{
DataTable dt = (DataTable)Session["IndexTable"]; //copy of the GirdView
int rowIndex = Convert.ToInt32(e.CommandArgument.ToString());
DataRow row = dt.Rows[rowIndex];
GenerateReport(row["ITEM_ID"].ToString());
}
private void GenerateReport(string itemID)
{
OracleConnection connection = new OracleConnection(connstr);
try
{
connection.Open();
//code here omitted, all sql and setting up info for the doc
// giving TurnOverData a dataset
ReportDocument doc = new ReportDocument();
doc.FileName = Server.MapPath("myRpt.rpt");
doc.SetDataSource(TurnoverData);
//here adding parameters to doc
System.IO.MemoryStream stream = (System.IO.MemoryStream)doc.ExportToStream(ExportFormatType.PortableDocFormat);//leftover code from previous functionality (i dont think it is doing anything)
BinaryReader Bin = new BinaryReader(doc.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat));
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType="application/pdf";
Response.BinaryWrite(Bin.ReadBytes(Convert.ToInt32(Bin.BaseStream.Length)));
Response.Flush();
Response.Close();
}
catch (Exception ex)
{
Logger.logError("GenerateReport() " + ex.Message);
Utilities.SendAnAlert(this, "An error occurred while generating PDF file and the file could not be displayed.");
}
finally
{
connection.Close();
connection.Dispose();
}
}
提前致谢
更新:
经过大量挖掘我们的旧代码,我找到了解决方法。你们向我建议的几乎所有代码都已经在我们的代码中,我只需要弄清楚如何使用我们所拥有的。我最终使用了我的 LoadPDF 函数,但不得不向它传递一个字符串参数,因为网址使用了我必须填写的"?= "。我感谢所有的帮助!
尝试在响应中添加 Content-Disposition/Content-Length 标头:
Response.AddHeader("Content-Disposition", "inline; filename='"report.pdf'"");
Response.AddHeader("Content-Length", Bin.BaseStream.Length);
为什么这需要通过javascript来完成?
会不会
<a href="myPDF.aspx" target="_blank">blah</a>
做这个把戏?
编辑
我做了一些研究,你用错了Request.Close()
。 根据文档,该方法"不适用于正常的HTTP请求处理"。
也许你应该改用Request.End()
。
该行应该可以修复它,但我也会考虑更改
System.IO.MemoryStream stream = (System.IO.MemoryStream)doc.ExportToStream(ExportFormatType.PortableDocFormat);//leftover code from previous functionality (i dont think it is doing anything)
BinaryReader Bin = new BinaryReader(doc.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat));
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType="application/pdf";
Response.BinaryWrite(Bin.ReadBytes(Convert.ToInt32(Bin.BaseStream.Length)));
Response.Flush();
更像的东西
System.IO.MemoryStream stream = (System.IO.MemoryStream)doc.ExportToStream(ExportFormatType.PortableDocFormat);
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType="application/pdf";
stream.CopyTo(Response.OutputStream);
Response.Flush();
但如果它有效,它就会起作用。