3

大量のレポートを定期的に生成する必要がある MVC3 アプリケーションがあります。ユーザーは基準を選択してレポートを起動できます。現在、javascript window.open() メソッドを使用して新しいタブ/ウィンドウを開いています。レポートが生成されている間、ユーザーはサイトを使用できません。レポートが生成されるまですべてが待機します。レポートを生成するコードは次のとおりです。

private FileStreamResult doSpecReport(List<int> idProjItems)
{
    PdfDocument outputDocument = new PdfDocument(); // returning to the user
    foreach(var id in idProjItems)
    {
        var item = _entities.ProjectEquipmentItems.First(f => f.idProjectEquipmentItem == id);
        var cutsheetPath = item.CutSheet;
        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        dictionary.Add("p_idEquipmentItem", id.ToString());
        var fs = GetReportHtml("NameOfReport", dictionary); // Returns FileStreamResult from crystal

        var inputDocument1 = CompatiblePdfReader.Open(fs.FileStream); // add report to output doc
        int count = inputDocument1.PageCount;
        for(int idx = 0; idx < count; idx++) 
        {
            PdfPage page = inputDocument1.Pages[idx];
            outputDocument.AddPage(page);
        }

        if (!string.IsNullOrEmpty(cutsheetPath))
        {
            cutsheetPath = Path.Combine(Server.MapPath("~/Files/CutSheetFiles/"), cutsheetPath);
            if (File.Exists(cutsheetPath))
            {
                var inputDocument2 = CompatiblePdfReader.Open(cutsheetPath);//, PdfDocumentOpenMode.Import);
                count = inputDocument2.PageCount;
                for(int idx = 0; idx < count; idx++)
                {
                    PdfPage page = inputDocument2.Pages[idx];
                    outputDocument.AddPage(page);
                }
            }
        }
    }

    var ms = new MemoryStream();
    outputDocument.Save(ms, false);
    ms.Position = 0;

    return new FileStreamResult(ms, "application/pdf")
    {
        FileDownloadName = "Report.pdf"
    };
}

このプロセスがブラウザのすべてのリソースを占有する理由がわかりません。助けてくれてありがとう。

更新: doSpecReport を呼び出すコードの 1 つのバージョン。成功の周りのコードは機能しません。

$.ajax({
    url: url,
    data: qdata,
    type: "POST",
    success: function (result) { // this doesn't actually work.
        var obj = $('<object type="application/pdf" width="100%" height="100%" border="2"></object>');
        obj.attr('data', 'data:application/pdf;base64,' + result);
        $(".mask").hide();
        $('#divContainer').append(obj);
    }
});
4

1 に答える 1

0

サーバー側で一時ファイルの場所を生成し、場所の URL を返す必要があります。バイナリ PDF で HTML ドキュメントのコンテンツを設定することはできません。レポートを生成して一時的な場所に保存し、その URL リンクを応答で渡すことができますか。doSpecReport が mypdf.pdf という名前の一時 PDF ファイルを生成すると仮定すると、

次に、成功ブロックで、それをオブジェクト データ属性に追加して、最終オブジェクトが次のようになるようにすることができます

  <object width="400" height="500" type="application/pdf" data="/my_pdf.pdf?#zoom=85&scrollbar=0&toolbar=0&navpanes=0" id="pdf_content">

  </object>
于 2013-10-04T15:06:59.493 に答える