Преобразовать HTML-код PartialView в строку для ITextSharp HtmlParser
У меня есть частичное представление, я пытаюсь использовать ITextSharp для преобразования HTML в PDF. Как я могу преобразовать HTML в строку, чтобы я мог использовать ItextSharps HtmlParser?
Я пробовал что-то подобное без удачи... есть идеи?
var contents = System.IO.File.ReadAllText(Url.Action("myPartial", "myController", new { id = 1 }, "http"));
1 ответ
Решение
Я создал специальный класс ViewResult, который вы можете вернуть в результате действия.
Вы можете увидеть код на bitbucket (посмотрите на класс PdfFromHtmlResult).
Так что это в основном делает:
- Отрисовать представление через движок Razor (или любой другой зарегистрированный движок) в Html
- Дайте html iTextSharp
- вернуть pdf как ViewResult (с правильным mimetype и т. д.).
Мой класс ViewResult выглядит так:
public class PdfFromHtmlResult : ViewResult {
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
}
if (string.IsNullOrEmpty(this.ViewName)) {
this.ViewName = context.RouteData.GetRequiredString("action");
}
if (this.View == null) {
this.View = this.FindView(context).View;
}
// First get the html from the Html view
using (var writer = new StringWriter()) {
var vwContext = new ViewContext(context, this.View, this.ViewData, this.TempData, writer);
this.View.Render(vwContext, writer);
// Convert to pdf
var response = context.HttpContext.Response;
using (var pdfStream = new MemoryStream()) {
var pdfDoc = new Document();
var pdfWriter = PdfWriter.GetInstance(pdfDoc, pdfStream);
pdfDoc.Open();
using (var htmlRdr = new StringReader(writer.ToString())) {
var parsed = iTextSharp.text.html.simpleparser.HTMLWorker.ParseToList(htmlRdr, null);
foreach (var parsedElement in parsed) {
pdfDoc.Add(parsedElement);
}
}
pdfDoc.Close();
response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", this.ViewName + ".pdf");
byte[] pdfBytes = pdfStream.ToArray();
response.OutputStream.Write(pdfBytes, 0, pdfBytes.Length);
}
}
}
}
При правильных методах расширения (см. BitBucket) и т. Д. Код в моем контроллере выглядит примерно так:
public ActionResult MyPdf(int id) {
var myModel = findDataWithID(id);
// this assumes there is a MyPdf.cshtml/MyPdf.aspx as the view
return this.PdfFromHtml(myModel);
}
Примечание: ваш метод не работает, потому что вы получите HTML на сервере, тем самым вы потеряете все куки (= информация о сеансе), которые хранятся на клиенте.