É muito comum precisarmos gerar PDFs em nossas aplicações, e muitas vezes, estes PDFs são referentes à conteúdos baseados em HTML. Há uma porção de componentes que são capazes de receber uma string como conteúdo HTML e gerar o respectivo PDF. Entre estes componentes, temos o Evo PDF, que possui uma API de fácil utilização. Para fazer uso do mesmo, basta utilizar o Nuget para instalar na aplicação que deseja fazer uso:
PM> Install-Package EvoPDF
O conteúdo a ser extraído está acessível através de uma URL, e utilizando a classe WebClient ou até mesmo o ASP.NET Web API (se quisermos um controle mais refinado), é possível realizar o download e na sequência, encaminhar o resultado para este componente gerar o PDF. Para o nosso exemplo, suponhamos que queremos renderizar o conteúdo de uma view (MVC/Razor) em formato PDF, e isso irá nos obrigar a criar um código que dado o caminho até a view, ele é capaz de criar o contexto necessário, indicando inclusive as informações necessárias (dados) para que ela seja exibida, e o ASP.NET faz o trabalho de executar e disponibilizar em um objeto do tipo StringWriter, todo o HTML gerado.
protected string RenderViewToString(string viewPath)
{
using (var writer = new StringWriter())
{
var controllerContext = this.ControllerContext;
var viewContext =
new ViewContext(
controllerContext,
new RazorView(controllerContext, viewPath, null, false, null),
new ViewDataDictionary(),
new TempDataDictionary(),
writer);
viewContext.View.Render(viewContext, writer);
return writer.ToString();
}
}
Depois do conteúdo HTML já gerado, vamos recorrer ao método GetPdfBytesFromHtmlString da classe PdfConverter (parte do componente Evo PDF), que dado o conteúdo HTML, retorna um array de bytes com todo o documento PDF já gerado. Note que além do HTML, este método também recebe um endereço HTTP(s), que é a URL base para que seja possível resolver as imagens, arquivos CSS, JavaScripts, etc. E, por fim, submetemos o resultado deste método para o método File exposto pela classe Controller, indicando que trata-se de um arquivo do tipo PDF. A marca d’água é por conta de que eu estou utilizando a versão de avaliação deste componente.
public class TesteController : Controller
{
public ActionResult Index()
{
return File(
new PdfConverter().GetPdfBytesFromHtmlString(
RenderViewToString(“~/Views/Teste/Conteudo.cshtml”), “http://localhost:1891/”),
“application/pdf”);
}
[HttpGet]
public ActionResult Conteudo()
{
return View();
}
}