因此,我在內存中渲染了一個局部視圖,以便將視圖中的XSL-FO數據引導至PDF渲染器。ASP.NET MVC:我如何將控件渲染到流?
PDF渲染器可以接受字符串,XmlDocument或Stream作爲輸入。
這裏是我想要做什麼:(編輯爲清楚起見)
解決方案摘自: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,或者我只是搞砸了一些東西別的了。
如果我用StringWriter替換StreamWriter,它可以正常工作,但是我不能使用StringWriter,因爲當我調用.ToString()時,我得到了各種各樣的使XSL-FO搞亂的轉義字符,並且呈現器拋出「Illegal字符「的例外。
我通過創建一個XmlDocument並加載字符串來解決這個問題,但它似乎是一個非常迂迴的做事方式。我真的只想捕獲HtmlTextWriter的輸出並將其直接輸入到Renderer中。有沒有辦法做到這一點?
謝謝!
謝謝!就是這樣。使用調試器進行調試我不知道爲什麼在渲染控件後instream的長度爲0。在刷新StreamWriter之後,inStream長度讀取適當的長度並在完全讀取之前將位置設置爲0。再次感謝! – 2010-08-30 17:37:04