2013-02-27 7 views
7

stiamo realizzando un'app MV.NET ASP.Net che deve essere in grado di generare un PDF e visualizzarlo sullo schermo o salvarlo in un luogo facilmente accessibile all'utente. Stiamo usando PdfSharp per generare il documento. Una volta finito, come possiamo consentire all'utente di salvare il documento o aprirlo in un lettore? Sono particolarmente confuso perché il PDF è generato lato server ma lo vogliamo mostrare sul lato client.Come faccio a visualizzare un PDF utilizzando PdfSharp in ASP.Net MVC?


Ecco il controller MVC per creare il rapporto che abbiamo scritto finora:

public class ReportController : ApiController 
{ 
    private static readonly string filename = "report.pdf"; 

    [HttpGet] 
    public void GenerateReport() 
    { 
     ReportPdfInput input = new ReportPdfInput() 
     { 
      //Empty for now 
     }; 

     var manager = new ReportPdfManagerFactory().GetReportPdfManager(); 
     var documentRenderer = manager.GenerateReport(input); 
     documentRenderer.PdfDocument.Save(filename); //Returns a PdfDocumentRenderer 
     Process.Start(filename); 
    } 
} 

Quando questo viene eseguito, ottengo un UnauthorizedAccessException a documentRenderer.PdfDocument.Save(filename); che dice, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied. Sono, inoltre, non sicuro cosa accadrà quando viene eseguita la riga Process.Start(filename);.

Questo è il codice in manager.GenerateReport(input):

public class ReportPdfManager : IReportPdfManager 
{ 
    public PdfDocumentRenderer GenerateReport(ReportPdfInput input) 
    { 
     var document = CreateDocument(input); 
     var renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); 
     renderer.Document = document; 
     renderer.RenderDocument(); 

     return renderer; 
    } 

    private Document CreateDocument(ReportPdfInput input) 
    { 
     //Put content into the document 
    } 
} 

risposta

6

io non sono familiarità con PDF tagliente ma per MVC è fatto per lo più tramite costruito in funzione. È necessario ottenere il documento PDF rappresentato come una matrice di byte. Quindi devi semplicemente utilizzare il metodo File di MVC per restituirlo al browser e lasciarlo gestire il download. Ci sono metodi sulla loro classe per farlo?

public class PdfDocumentController : Controller 
{ 
    public ActionResult GenerateReport(ReportPdfInput input) 
    { 
     //Get document as byte[] 
     byte[] documentData; 

     return File(documentData, "application/pdf"); 
    } 

} 
+3

C'è un campione web che mostra come ottenere la matrice di byte e restituirla all'utente senza MVC. Con MVC è necessario solo il codice per ottenere l'array di byte (dal flusso di memoria, nessun file richiesto). Esempio: http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

Per i nuovi utenti, diventa un po 'di confusione, quindi (NickAlbrecht) si preoccuperà di aggiornare la risposta per fare la cosa esatta come @PDFsharpTeam aggiunto un link di supporto. [** MemoryStream stream = new MemoryStream(); //// document.Save (stream, false); //// Byte [] documentBytes = stream.ToArray(); //// return File (documentBytes, "application/pdf"); **] (Mi ha aiutato molto. Grazie !!!) –

11

Utilizzando il suggerimento di Yarx e tutorial di PDFsharp squadra, questo è il codice che abbiamo finito con:

Controller:

[HttpGet] 
public ActionResult GenerateReport(ReportPdfInput input) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     var manager = new ReportPdfManagerFactory().GetReportPdfManager(); 
     var document = manager.GenerateReport(input); 
     document.Save(stream, false); 
     return File(stream.ToArray(), "application/pdf"); 
    } 
} 

ReportPdfManager:

public PdfDocument GenerateReport(ReportPdfInput input) 
{ 
    var document = CreateDocument(input); 
    var renderer = new PdfDocumentRenderer(true, 
     PdfSharp.Pdf.PdfFontEmbedding.Always); 
    renderer.Document = document; 
    renderer.RenderDocument(); 

    return renderer.PdfDocument; 
} 

private Document CreateDocument(ReportPdfInput input) 
{ 
    //Creates a Document and puts content into it 
} 
+0

FYI: La riga 'document.Save (stream, false)' accetta il parametro 'false' per indicare che' stream' non deve essere chiuso come un effetto collaterale della chiamata di 'Save'. Questo comportamento è necessario in modo che possiamo chiamare 'stream.ToArray' nella riga successiva, e in modo che il blocco' using' che abbiamo usato possa funzionare come previsto. – Kevin

+0

Ho scaricato e fatto riferimento alla DLL ma dice che non riesce a trovare ReportPdfInput ..? – Murphybro2

+0

@ Murphybro2 'ReportPdfInput' era una classe che abbiamo scritto che conteneva tutte le informazioni necessarie per rendere il PDF che volevamo. Non fa parte della biblioteca. Dispiace per la confusione! – Kevin

Problemi correlati