Как отобразить ASP.NET MVC View в формате PDF - PullRequest
22 голосов
/ 25 августа 2009

Я работаю с утилитой ExpertPDF Html-to-PDF для этого вопроса (хотя я открыт для других библиотек, если есть достаточно документации).

Короче говоря, у меня есть представление, которое отформатировано определенным образом, и я хотел бы отобразить его в виде документа PDF, который пользователь может сохранить на диск.

Пока что у меня есть PrintService (который реализует интерфейс IPrintService), и в этой реализации есть две перегрузки для PrintToPDF (), одна из которых принимает только URL, а другая - строку HTML, и обе из которых возвращают байт []. Я только проработал детали второй перегрузки, которая требует строку HTML.

То, что я хотел бы сделать с моего контроллера, выглядит примерно так:

public FileStreamResult Print(int id)
{
    var model = _CustomRepository.Get(id);
    string renderedView = SomethingThatRendersMyViewAsAString(model);
    Stream byteStream = _PrintService.PrintToPdf(renderedView);
    HttpContext.Response.AddHeader("content-disposition", 
        "attachment; filename=report.pdf");
    return new FileStreamResult(byteStream, "application/pdf");  
}

, который теоретически выдает PDF на страницу. Это «SomethingThatRendersMyViewAsAString», с которой я ищу помощи. Есть ли быстрый способ получить строковое представление вида? Или, может быть, я должен просто придерживаться перегрузки URL-адреса и передать URL-адрес для просмотра ... Есть еще мысли?

Спасибо!

Ответы [ 4 ]

94 голосов
/ 22 февраля 2012

Я упаковал свое решение в пакет Nuget: Rotativa http://nuget.org/packages/Rotativa. Он основан на wkhtmltopdf.

Использование действительно просто.

Имея действие, которое вы хотели бы использовать как PDF, а не как HTML-страницу. Вы можете определить действие, которое возвращает ActionResult типа ActionAsPdf (также доступен RouteAsPdf). Так что код просто:

public ActionResult PrintIndex()
{
    return new ActionAsPdf("Index", new { name = "Giorgio" }) { FileName = "Test.pdf" };
}

Имя = "Джорджо" является параметром маршрута.

Работает, даже если действие для печати защищено аутентификацией веб-форм (атрибут [Authorize])

10 голосов
/ 25 августа 2009

Вы можете подключиться к Response во время OnResultExecuting и заменить свойство Filter чем-то, что сохраняет результирующий HTML в MemoryStream. Затем вы можете очистить Ответ во время OnResultExecuted и заменить его результатами вашего преобразования PDF. Однако я не уверен, что это будет лучше, чем просто получить HTML-код из URL.

 public FileStreamResult Print(int id)
 {
     var model = _CustomRepository.Get(id);
     this.ConvertToPDF = true;
     return View( "HtmlView" );
 }

 public override OnResultExecuting( ResultExecutingContext context )
 {
      if (this.ConvertToPDF)
      {
          this.PDFStream = new MemoryStream();
          context.HttpContext.Response.Filter = new PDFStreamFilter( this.PDFStream );
      }
 }

 public override OnResultExecuted( ResultExecutedContext context )
 {
      if (this.ConvertToPDF)
      {
          context.HttpContext.Response.Clear();
          this.PDFStream.Seek( 0, SeekOrigin.Begin );
          Stream byteStream = _PrintService.PrintToPDF( this.PDFStream );
          StreamReader reader = new StreamReader( byteStream );
          context.HttpContext.Response.AddHeader( "content-disposition",
                 "attachment; filename=report.pdf" );
          context.HttpContext.Response.AddHeader( "content-type",
                 "application/pdf" );
          context.HttpContext.Response.Write( reader.ReadToEnd() );
      }
}

PDFStreamFilter должен переопределить метод (ы) «записи» и вместо этого отправить данные в поток памяти.

1 голос
/ 27 августа 2009

Похоже, у меня возникла похожая проблема, когда я хотел использовать Представления в качестве шаблонов электронной почты. Лучший ответ, который я нашел для получения строкового представления представления, был здесь: Отображение представления в виде строки

0 голосов
/ 15 июля 2013

Лучший пакет, который я нашел, - это RazorPDF , доступный в виде пакета на NuGet.org на основе iTextSharp . Работает на веб-сайтах Azure:

https://nuget.org/packages/RazorPDF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...