2016-03-30 1 views
2

Я пытаюсь создать PDF-файл на сервере, а затем открыть его на новой вкладке в браузере при нажатии кнопки. PDF-файл генерируется отлично, но я не могу заставить браузер открывать его без загрузки. В IE он не распознает файл, а в Chrome он запрашивает пользователя для загрузки. Любая помощь приветствуется. Мой код ниже:Создайте сторону PDF-сервера и откройте в новом окне браузера или вкладке

C# Контроллер

public string CreateCustomReport() 
{ 
    var doc = new Document(); 
    MemoryStream m = new MemoryStream(); 

    try 
    { 
     string query = ""; 
     PdfWriter.GetInstance(doc, m).CloseStream = false; 

     SqlConnection conn = new SqlConnection(conn); 
     conn.Open(); 

     SqlCommand cmd = new SqlCommand(query, conn); 
     cmd.CommandType = CommandType.Text; 
     SqlDataReader sqdr = cmd.ExecuteReader(); 

     doc.Open(); 
     PdfPTable table = new PdfPTable(4); 
     PdfPCell cell = new PdfPCell(new Phrase(customTitle)); 
     cell.Colspan = 4; 
     table.AddCell(cell); 
     table.AddCell(groupBy); 
     table.AddCell(col1); 
     table.AddCell(col2); 
     table.AddCell("Event"); 
     while (sqdr.Read()) 
     { 
      table.AddCell(Convert.ToString(sqdr["GroupBy"].ToString())); 
      table.AddCell(Convert.ToString(sqdr["Col1"].ToString())); 
      table.AddCell(Convert.ToString(sqdr["Col2"].ToString())); 
      table.AddCell(Convert.ToString(sqdr["Events"].ToString())); 
     } 

     doc.Add(table); 
     doc.Close(); 
    } 
    catch (Exception) 
    { 

    } 
    return System.Convert.ToBase64String(m.ToArray()); 
} 

JQuery

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(params), 
    url: '@Url.Action("CreateCustomReport")', 
    error: function(error) { 
     debugger; 
     alert("Search failed."); 
    }, 

    success: function(data) { 
     var openpdf = $('<a id="openpdf" download="Report.pdf" href="data:application/pdf;base64,' + data + '" target="new">'); 
     $('body').append(openpdf); 
     document.getElementById("openpdf").click(); 
     $("#openpdf").remove(); 


    } 
}); 

ответ

0

ответ Нава не решает проблему OP, поскольку она по-прежнему загружает файл, а не открыть его в новой вкладке. Вам нужно будет изменить заголовок ответа, чтобы это произошло.

public FileResult CreateCustomReport() 
{ 
    ... 
    Response.AppendHeader("Content-Disposition", "inline; filename=Out.pdf"); 
    return File(m.ToArray(), "application/pdf"); 
} 

И тогда, на ваш взгляд:

<a href="@Url.Action("CreateCustomReport")" target="_blank">Download PDF</a>

Если вы хотите скрыть ссылку для загрузки после того, как она была нажата, вы можете просто добавить onclick на ваш якорь:

<a href="@Url.Action("CreateCustomReport")" target="_blank" onclick="this.style.display='none'">Download PDF</a>

Редактировать: Я не могу комментировать другой ответ, но, прочитав из вашего комментария, кажется, что вы ed для передачи аргументов по запросу POST. Если вам действительно нужно сделать это с помощью POST, вы можете использовать скрытую форму и атрибут target="_blank". Если вы можете сделать это с помощью GET, вы можете просто вставить данные в свой URL-адрес, а затем можете просто использовать простой якорный тег.

3

Вы возвращаете кодированное представление Base-64 сгенерированного PDF-файла, используя эту строку, чтобы создать ссылку и установить встроенную строку href. Затем вы вызываете щелчок по ссылке. Кажется очень сложным.

я бы другой подход ...

Есть сервер возвращает PDF байт (я предполагаю, что PDFWriter есть способ доступа к Byte []):

public ActionResult CreateCustomReport() 
{ 
    byte[] contents = doc.GetBytes(); //????? 
    return File(contents, "application/pdf", "test.pdf"); 
} 

Тогда, не использовать AJAX вызова и вместо того, чтобы перенаправить пользователя на веб-сайте:

<a href="@Url.Action("CreateCustomReport")" target="_blank">Download PDF</a> 

Этот подход не зависит от JavaScript и будет работать на IE или Chrome без запроса пользователя для загрузки/сохранения файла. И PDF будет отображаться в новом окне браузера/вкладке.

+0

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

Смежные вопросы