そのため、ビュー内のXSL-FOデータをPDFレンダラーに転送するために、メモリ内の部分的なビューをレンダリングしています。
PDFレンダラーは、文字列、XmlDocument、またはStreamを入力として受け取ることができます。
これが私がやりたいことです:(明確にするために編集されました)
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に置き換えると正常に機能しますが、.ToString()を呼び出すと、XSL-FOを台無しにするあらゆる種類のエスケープ文字が表示され、レンダラーが「不正な文字」例外をスローするため、StringWriterを使用できません。
XmlDocumentを作成し、それに文字列をロードすることでこれを回避しましたが、これは非常に回りくどい方法のようです。HtmlTextWriterからの出力をキャプチャして、レンダラーに直接フィードしたいだけです。これを行う方法はありますか?
ありがとう!