Открыть динамически сгенерированный PDF в Tab или iframe - PullRequest
3 голосов
/ 28 марта 2012

Пожалуйста, помогите. Я, очевидно, не эксперт, но, используя предложения с этого сайта, я думаю, что я действительно близок к тому, чтобы сделать следующее

Возможность открывать динамически сгенерированный PDF-файл в а) новая вкладка б) iframe

Надеюсь, мне просто нужна пара строк правильного синтаксиса, и я буду там.

Я динамически генерирую PDF в контроллере, используя itextSharp

CONTROLLER

public FileStreamResult GetPdf()
  {
    ...
    return new FileStreamResult(Response.OutputStream, "application/pdf"){FileDownloadName = "download.pdf"};
  }

VIEW

<input id="btnNewTab" type="button" value="New Tab" />
<input id="btnIframe" type="button" value="Iframe" />

<div id="pdfDiv"></div>

<script type="text/javascript">
  $(function () {

    $("#btnIframe").click(function () {
      $.get('/PDFTest/GetPdf', function (pdf) {
        alert(pdf.length);  // Works as expected
        // What do I need to put here to get the pdf to appear in a iframe
      });
    });

    $("#btnNewTab").click(function () {
      // asks me if I want to Open or Save the PDF.
      // If I choose Open, the PDF opens in a completely new Window.
      // Instead of the dialog, I just want the PDF to open in a new Tab
      // I am probably going about this in completely the wrong way.
      var HTML = "<iframe src='/PDFTest/GetPdf' style='width: 100%; height: 600px' ></iframe>";
      $('#pdfDiv').html(HTML);
    });

  });
</script>

В ответ на ваше предложение, Дарин, я изменил контроллер на:

public FileStreamResult GetPdf(someInfo from View)
  {
    ...
      Response.ContentType = "application/pdf";
      Response.AddHeader("Content-Disposition", "inline;test.pdf"); 
      Response.Buffer = true;
      Response.Clear();
      Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
      Response.OutputStream.Flush();
      Response.End();

      return new FileStreamResult(Response.OutputStream, "application/pdf");
  }

Сделав это, ваши предложения сработали нормально, но я понимаю, что недостаточно четко объяснил свои намерения. Поэтому я изменил ВИД, чтобы отразить то, что я пытаюсь сделать.

input id="btnNewTab" type="button" value="New Tab" />
<input id="btnIframe" type="button" value="Iframe" />
<iframe id="iframe"></iframe>
<div id="pdfDiv">
</div>
<script type="text/javascript">
  $(function () {

    $("#btnIframe").click(function () {

      $.ajax({
        url: '/PDFTest/GetPdf',
        type: "GET",
        data: json,  // This line will not be a problem
        dataType: "json",
        contentType: "application/pdf", // This line might be a problem
        success: function (pdf) {
          // What to I need to need to do to display the PDF in the above iframe
          $("#iframe").attr("src", pdf); // HTTP Error 400 - Bad Request.
        }
      });
    });

    $("#btnNewTab").click(function () {
      $.ajax({
        url: '/PDFTest/GetPdf',
        type: "GET",
        data: json,  // This line will not be a problem
        dataType: "json",
        contentType: "application/pdf", // This line might be a problem
        success: function (pdf) {
          // What to I need to need to do to disply the PDF in a new window
        }
      });
    });

  });
</script>

1 Ответ

6 голосов
/ 28 марта 2012

Действие:

public ActionResult GetPdf()
{
    byte[] pdf = ...
    Response.AppendHeader("Content-Disposition", "inline;test.pdf");
    return File(pdf, "application/pdf");
}

Чтобы открыть в новой вкладке / окне:

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

Чтобы открыть в фрейме, ваш код выглядит нормально.Просто убедитесь, что заголовок Content-Disposition установлен на inline.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...