Итак, я представляю частичный вид в памяти, чтобы направлять данные XSL-FO в представление в средство визуализации PDF.ASP.NET MVC: как я могу визуализировать элемент управления потоком?
Средство рендеринга PDF может принимать строку, XmlDocument или Stream в качестве входных данных.
Вот что я хотел бы сделать: (Отредактировано для ясности)
Solution взяты из: http://thriftybliss.spaces.live.com/blog/cns!58DA805F37F31F20!170.entry?wa=wsignin1.0&sa=362921628
var viewPage = new ViewPage();
var viewData = new ViewDataDictionary(model);
viewPage.ViewData = viewData;
var control = viewPage.LoadControl(viewName);
viewPage.Controls.Add(control);
using (var inStream = new MemoryStream())
{
using (var sw = new StreamWriter(inStream))
{
using (var tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
using (var outStream = new MemoryStream())
{
driver.Render(inStream, outStream);
return outStream.ToArray();
}
}
}
Вот что работает, но то, что я предпочел бы не делать:
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
using (var tw = new HtmlTextWriter(sw))
{
vp.RenderControl(tw);
}
}
var xml = new XmlDocument();
xml.LoadXml(sb.ToString());
using (var ms = new MemoryStream())
{
driver.Render(xml, ms);
return ms.ToArray();
}
к сожалению, HtmlTextWriter, кажется, не хочет писать в StreamWriter, или, возможно, я просто испортил что-то еще.
Если я заменю StreamWriter на StringWriter, он отлично работает, но я не могу использовать StringWriter, потому что, когда я вызываю .ToString(), я получаю всевозможные escape-символы, которые испортили XSL-FO, а рендеринг бросает «Незаконный Исключение составляют символы.
Я обошел это, создав XmlDocument и загрузив в него строку, но это похоже на очень окольный способ делать вещи. Я просто хотел бы просто захватить вывод из HtmlTextWriter и передать его прямо в Renderer. Есть какой-либо способ сделать это?
Спасибо!
Спасибо! Вот и все.Поступая с отладчиком, я не знал, почему длина inStream равна 0 после рендеринга Control. После промывки StreamWriter длина inStream считывает правильную длину и устанавливает положение на 0, прежде чем читать отлично работает. Еще раз спасибо! –