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 の後)。2 つ目は、実際に 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 に答える