2016-03-30 11 views
2

Ich versuche, eine PDF auf dem Server zu erstellen und öffnen Sie dann in einem neuen Tab im Browser, wenn eine Schaltfläche geklickt wird. Die PDF-Datei wird korrekt erstellt, aber ich kann den Browser nicht öffnen, ohne sie herunterzuladen. In IE erkennt es die Datei nicht und in Chrome fordert es den Benutzer zum Herunterladen auf. Jede Hilfe wird geschätzt. Mein Code ist unten:PDF-Server-Seite erstellen und in einem neuen Browserfenster oder Tab öffnen

C#-Controller

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(); 


    } 
}); 

Antwort

0

Nava Antwort OPs nicht Problem lösen, da es immer noch die Datei herunterlädt, anstatt sie in einem neuen Tab zu öffnen. Sie müssen den Antwort-Header ändern, um dies zu ermöglichen.

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

Und dann in der Ansicht:

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

Wenn Sie den Download-Link verstecken wollen, nachdem es angeklickt wurde, können Sie einfach ein onclick zu Ihrem Anker hinzu:

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

Edit: Ich kann die andere Antwort nicht kommentieren, aber lesen von Ihrem Kommentar, es scheint Sie ne ed, um Argumente durch eine POST-Anfrage zu übergeben. Wenn Sie dies wirklich per POST tun müssen, könnten Sie ein verstecktes Formular und target="_blank" Attribut verwenden. Wenn Sie es mit GET tun können, dann können Sie einfach die Daten in Ihre URL einbetten und dann können Sie einfach ein einfaches Anchor-Tag verwenden.

3

Sie geben eine Base-64-codierte Darstellung der generierten PDF-Datei zurück und verwenden diese Zeichenfolge, um eine Verknüpfung zu erstellen und die href-Eigenschaft inline festzulegen. Dann lösen Sie einen Klick auf den Link aus. Scheint sehr kompliziert.

ich einen anderen Ansatz nehmen würde ...

Haben der Server die PDF Bytes zurückgeben (Ich gehe davon aus PDFWriter einen Weg hat die byte [] zuzugreifen):

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

Dann nicht AJAX-Aufruf verwenden und stattdessen die Benutzer auf die uRL umleiten:

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

Dieser Ansatz nicht auf JavaScript abhängt und auf IE oder Chrome arbeiten, ohne dass der Benutzer aufgefordert zum Download/die Datei speichern. Und das PDF wird in einem neuen Browserfenster/Tab angezeigt.

+0

Dies ist viel sauberer, aber der Grund, warum ich es so mache, ist, weil das PDF basierend auf Benutzereingaben generiert wird und es zurückgeschickt werden muss, wenn der Benutzer auf eine Schaltfläche klickt, um es zu senden. Ich habe die Argumente für die CreateCustomReport-Methode ausgeschlossen, weil ich sie nicht für relevant hielt. –

Verwandte Themen