Pregunta

Así que estoy haciendo una vista parcial en la memoria con el fin de dirigir los datos XSL-FO en la vista a un procesador de PDF.

El procesador de PDF puede tener una cadena, XmlDocument o corriente como entrada.

Esto es lo que me gustaría hacer: ( Editado por claridad )

Solución tomado 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();
        }
    }
}

Esto es lo que funciona, pero lo que prefiero no hacer:

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

Por desgracia, no parece la HtmlTextWriter a querer escribir en el StreamWriter, o tal vez acabo en mal estado algo más arriba.

Si sustituyo StreamWriter con StringWriter que trabaja muy bien, pero no puedo utilizar StringWriter porque cuando llamo .ToString () consigo todo tipo de caracteres de escape que desordenar el XSL-FO y el procesador se emite una "Caracteres no admitidos "excepción.

Tengo todo esto creando un XmlDocument y la carga de la cadena en eso, sino que parece ser una manera muy indirecta de hacer las cosas. Yo realmente como sólo capturar la salida de la HtmlTextWriter y se alimentan directamente en el procesador. ¿Hay alguna manera de hacer esto?

Gracias!

¿Fue útil?

Solución

Cuando usted dice "no parece HtmlTextWriter a querer escribir en el StreamWriter" ¿Quiere decir que driver.Render no puede conseguir cualquier byte de in-stream? Dos posibilidades que se me ocurre ...

En primer lugar es que HtmlTextWriter no está vaciando la corriente después de que la escritura de hacerlo, en cuyo caso puede que necesite un sw.Flush() allí antes de entregar el Instream a driver.Render.

En segundo lugar es que después de escribir a la MemoryStream, el puntero ubicación será en el final de la secuencia, y cualquier intento de leer de él producirá cero bytes (ya que es al final).

En ese caso, el establecimiento de inStream.Position a 0, o llamando inStream.Seek(0, SeekOrigin.Begin) antes de llamar driver.Render debe solucionarlo.

He corrió a la segunda situación un par de veces antes, así que mi mejor conjetura.

Otros consejos

no he probado esto en absoluto. .. pero es una versión modificada de un RenderViewToString método que hice y el uso en otra parte:

    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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top