1

我创建了一个 PDF,我正在尝试在新窗口(或新选项卡,但我现在可以使用新窗口)中打开它

这是我的aspx代码。链接按钮位于面板中的 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 函数,但不得不向它传递一个字符串参数,因为我必须填写使用的 url"?="。感谢所有帮助!

4

2 回答 2

1

为什么这需要通过 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();

但如果它有效,它就会有效。

于 2012-04-18T20:59:27.773 回答
1

尝试将 Content-Disposition/Content-Length 标头添加到您的响应中:

Response.AddHeader("Content-Disposition", "inline; filename=\"report.pdf\"");
Response.AddHeader("Content-Length", Bin.BaseStream.Length);
于 2012-04-18T20:59:56.460 回答