2013-02-27 2 views
7

Мы создаем приложение ASP.Net MVC, которое должно иметь возможность создавать PDF-файлы и отображать их на экране или сохранять их где-то легко для пользователя. Мы используем PdfSharp для создания документа. Как только мы закончим, как мы разрешим пользователю сохранять документ или открывать его в читателе? Меня особенно смущает, потому что PDF создается серверной стороной, но мы хотим, чтобы он отображался на стороне клиента.Как показать PDF с помощью PdfSharp в ASP.Net MVC?


Вот контроллер MVC, чтобы создать отчет, который мы написали до сих пор:

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

Когда это работает, я получаю UnauthorizedAccessException в documentRenderer.PdfDocument.Save(filename);, который говорит, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied. Я также не уверен, что произойдет, когда будет выполнена строка Process.Start(filename);.

Это код в 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 
    } 
} 

ответ

6

Я не знаком с PDF резким, но для MVC в основном делается с помощью встроенных функций. Вам нужно получить ваш документ в формате pdf, представленный как массив байтов. Затем вы просто используете метод файла MVC, чтобы вернуть его в браузер и позволить ему обрабатывать загрузку. Существуют ли какие-либо методы в их классе для этого?

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

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

} 
+3

Существует веб-образец который показывает, как получить массив байтов и вернуть его пользователю без MVC. С MVC вам нужен только код для получения байтового массива (из потока памяти, без файла). Пример: http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

Для новых пользователей это становится немного запутанным, так что бы вы (NickAlbrecht) потрудились обновить ответ, чтобы сделать то же самое, что и @PDFsharpTeam. вспомогательная ссылка. [** поток MemoryStream = новый MemoryStream(); //// document.Save (поток, ложь); //// Байт [] documentBytes = stream.ToArray(); //// return File (documentBytes, «application/pdf»); **] (Это очень помогло мне. Спасибо!) –

11

Используя предложение Yarx в и обучающую PDFsharp команды, это код, который мы закончили с:

Контроллер:

[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: строка 'document.Save (stream, false)' принимает параметр 'false', чтобы указать, что' stream' не следует закрывать как побочный эффект вызова 'Save'. Такое поведение необходимо, поэтому мы можем вызывать 'stream.ToArray' в следующей строке и так, чтобы используемый нами блок' using' использовался, как и ожидалось. – Kevin

+0

Я загрузил и ссылался на DLL, но он говорит, что не может найти ReportPdfInput ..? – Murphybro2

+0

@ Murphybro2 'ReportPdfInput' был классом, который мы написали, который содержал всю информацию, необходимую для рендеринга PDF, который мы хотели. Это не часть библиотеки. Извините за беспорядок! – Kevin

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