Question

Je suis rendu une vue partielle en mémoire afin de diriger les données XSL-FO en vue d'un PDF renderer.

Le PDF peut prendre une renderer chaîne, XmlDocument ou flux en entrée.

Voici ce que je voudrais faire: ( Edité pour plus de clarté )

Solution tirée de: 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();
        }
    }
}

Voici ce qui fonctionne, mais ce que je préfère ne pas faire:

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();
}

Malheureusement, le HtmlTextWriter ne semble pas vouloir écrire au StreamWriter, ou peut-être que je viens foiré quelque chose d'autre en place.

Si je remplace StreamWriter avec StringWriter il fonctionne très bien, mais je ne peux pas utiliser StringWriter parce que quand j'appelle .ToString () Je reçois toutes sortes de caractères d'échappement qui gâcher le XSL-FO et le moteur de rendu jette un « Caractères illégaux "exception.

Je suis autour en créant un XmlDocument et le chargement de la chaîne en cela, mais il semble que d'une manière très rond-point de faire les choses. Je voudrais vraiment juste pour capturer juste la sortie de la HtmlTextWriter et l'alimenter directement dans le moteur de rendu. Est-il possible de le faire?

Merci!

Était-ce utile?

La solution

Quand vous dites « HtmlTextWriter ne semble pas vouloir écrire au StreamWriter » que cela signifie que driver.Render ne peut pas obtenir des octets de InStream? Deux possibilités que je peux penser ...

La première est que HtmlTextWriter n'est pas le rinçage du flux après cela se fait par écrit, dans ce cas, vous pourriez avoir besoin d'un sw.Flush() là-dedans avant de vous remettre le Instream à driver.Render.

La deuxième est que, après avoir écrit au MemoryStream, le pointeur de l'emplacement sera à la fin du cours d'eau, et toute tentative de lecture de celui-ci donnera zéro octets (car il est à la fin).

Dans ce cas, la mise en inStream.Position à 0, ou en appelant inStream.Seek(0, SeekOrigin.Begin) avant d'appeler driver.Render devrait corriger.

Je l'ai couru dans la deuxième situation quelques fois auparavant, donc c'est ma meilleure estimation.

Autres conseils

Je n'ai pas testé du tout. .. mais il est une version modifiée d'un méthode RenderViewToString que je fait et utiliser ailleurs:

    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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top