2013-02-27 27 views
7

tworzymy aplikację ASP.Net MVC, która musi być w stanie wygenerować plik PDF i wyświetlić go na ekranie lub zapisać go w miejscu łatwo dostępnym dla użytkownika. Używamy PdfSharp do wygenerowania dokumentu. Po zakończeniu, w jaki sposób możemy pozwolić użytkownikowi zapisać dokument lub otworzyć go w czytniku? Jestem szczególnie zdezorientowany, ponieważ plik PDF jest generowany po stronie serwera, ale chcemy, aby wyświetlał się po stronie klienta.Jak wyświetlić plik PDF za pomocą PdfSharp w ASP.Net MVC?


Oto kontroler MVC, aby utworzyć raport, który mamy napisane do tej pory:

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

Gdy skończy, otrzymuję UnauthorizedAccessException na documentRenderer.PdfDocument.Save(filename); który mówi, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied. Jestem również nie jestem pewien co się stanie, gdy zostanie wykonana linia Process.Start(filename);.

Jest to kod w 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 
    } 
} 

Odpowiedz

6

Nie jestem obeznanym z PDF ostry ale dla MVC jest najczęściej odbywa się poprzez wbudowany w funkcjonalności. Musisz uzyskać dokument pdf reprezentowany jako tablica bajtów. Następnie wystarczy użyć metody pliku MVC, aby zwrócić ją do przeglądarki i pozwolić jej na pobranie. Czy są na to jakieś metody?

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

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

} 
+3

Jest próbka internetowej pokazuje, jak uzyskać tablicę bajtów i zwrócić ją użytkownikowi bez MVC. W MVC potrzebujesz tylko kodu, aby uzyskać tablicę bajtów (ze strumienia pamięci, bez pliku). Próbka: http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

Dla nowych użytkowników, staje się nieco mylące, więc czy (NickAlbrecht) kłopot aktualizacji odpowiedzi, aby dokładnie takie rzeczy, jak @PDFsharpTeam dodał link pomocnika. [** Strumień MemoryStream = new MemoryStream(); //// document.Save (stream, false); //// Byte [] documentBytes = stream.ToArray(); //// return File (documentBytes, "application/pdf"); **] (Bardzo mi to pomogło.) Thank you !!!) –

11

Korzystanie sugestię Yarx i samouczek PDFsharp zespołu, jest to kod skończyło się:

Kontroler:

[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: Wiersz 'document.Save (stream, false)' przyjmuje parametr 'false' wskazuje, że' stream' nie powinien być zamknięty jako efekt uboczny wywołania 'Save'. Takie zachowanie jest konieczne, abyśmy mogli wywołać 'stream.ToArray' w następnym wierszu, a użyty blok' using' może działać zgodnie z oczekiwaniami. – Kevin

+0

Pobrałem i odwołałem się do biblioteki DLL, ale jest napisane, że nie można znaleźć ReportPdfInput ..? – Murphybro2

+0

@ Murphybro2 'ReportPdfInput' była klasą, którą napisaliśmy, zawierającą wszystkie informacje niezbędne do renderowania pliku PDF, którego potrzebowaliśmy. To nie jest część biblioteki. Przepraszam za zamieszanie! – Kevin

Powiązane problemy