ASP.NET MVC:たいのですが描画のためのコントロールストリーム?
-
25-09-2019 - |
質問
さんのレンダリング、カスタマーサポートをメモリするため、XSL-FOデータのPDFレンダリング.
のPDFレンダリングできる文字列XmlDocumentまたはストリームとして入力します。
こちらはなんとい:(編集機能再構成に成功しました。)
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()すべて取得します種類のエスケープ文字は青,海とか氷とか雲海は、XSL-FOをレンダリングする"不正な文字"です。
ったことによXmlDocumentおよび積荷の文字列をそうですが、のように非常に遠回り方なっています。思うようなものから出力さHtmlTextWriter飼料で直接レンダリング.はありません。
よろしく!
解決
あなたが言うとき、「指定されたHtmlTextWriterは、StreamWriterのに書きたいようには見えませんが、」driver.Render
は、いずれかがあるinStreamから出バイト得ることができないということが意味するのでしょうか?私は...
まずそれはあなたがsw.Flush()
にあるinStreamを手渡す前に、あなたがそこにあるdriver.Render
が必要になる場合があります。その場合には書き込みを行うの後に、指定されたHtmlTextWriterは、ストリームをフラッシュしていないということです。
第二のMemoryStreamに書き込んだ後、位置ポインタは、ストリームの終わりになり、(それが終了ATのため)、それから読み取るための任意の試みはゼロバイトをもたらすことである。
その場合には、、0にinStream.Position
を設定する、またはそれを修正する必要がありinStream.Seek(0, SeekOrigin.Begin)
を呼び出す前にdriver.Render
を呼び出します。
私はそのための私の最高の推測ます。
、数回前に第2の状況に遭遇したをしました他のヒント
まだ試ことです。..で修理技術のデモンストレーションの RenderViewToString方法 生かした使用。
public static Stream RenderViewToStream<T>(string viewPath, T model, ControllerContext controllerContext)
{
var ms = new MemoryStream();
using (var writer = new StreamWriter(ms))
{
var view = new WebFormView(viewPath);
var vdd = new ViewDataDictionary<T>(model);
var viewCxt = new ViewContext(controllerContext, view, vdd, new TempDataDictionary(), writer);
viewCxt.View.Render(viewCxt, writer);
}
return ms;
}