3

そのため、ビュー内のXSL-FOデータをPDFレンダラーに転送するために、メモリ内の部分的なビューをレンダリングしています。

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に書き込みたくないようです。あるいは、何か他のものを台無しにしただけかもしれません。

StreamWriterをStringWriterに置き換えると正常に機能しますが、.ToString()を呼び出すと、XSL-FOを台無しにするあらゆる種類のエスケープ文字が表示され、レンダラーが「不正な文字」例外をスローするため、StringWriterを使用できません。

XmlDocumentを作成し、それに文字列をロードすることでこれを回避しましたが、これは非常に回りくどい方法のようです。HtmlTextWriterからの出力をキャプチャして、レンダラーに直接フィードしたいだけです。これを行う方法はありますか?

ありがとう!

4

2 に答える 2

1

「HtmlTextWriterはStreamWriterに書き込みたくないようです」と言うとき、それはdriver.RenderinStreamからバイトを取得できないことを意味しますか?私が考えることができる2つの可能性...

1つは、書き込みが完了した後、HtmlTextWriterがストリームをフラッシュしないことです。この場合sw.Flush()、inStreamをに渡す前にそこにが必要になることがありますdriver.Render

2つ目は、MemoryStreamに書き込んだ後、ロケーションポインターがストリームの最後にあり、そこから読み取ろうとすると、(最後にあるため)ゼロバイトが生成されることです。

その場合、inStream.Position0に設定するか、呼び出すinStream.Seek(0, SeekOrigin.Begin)前に呼び出すdriver.Renderと修正されます。

私は数回前に2番目の状況に遭遇したことがあるので、それが私の最善の推測です。

于 2010-08-30T17:28:08.983 に答える
-1

私はこれをまったくテストしていません。..しかし、これは私が作成して他の場所で使用した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;
    }
于 2010-08-30T16:57:54.117 に答える