Visualización de una página web como un pdf con un clic de un botón

Tengo un nuevo requisito para tener un botón en mi página web y, al hacer clic, muestra la página web en formato PDF. Al investigar descubrí que iTextSharp se utiliza para tal fin. pero tengo muchos Telerik y controles ASP en mi página web también. ¿Puedo obtener eso también en el PDF usando iTextSharp?

En caso afirmativo, ¿alguien puede proporcionarme un enlace básico para comenzar a usar? iTextSharp ya que no he encontrado esta herramienta todavía.

De acuerdo con la respuesta de @ahaliav, probé con el siguiente código. Sin embargo, no obtengo los controles en el pdf.

    protected void btnExport_Click(object sender, EventArgs e)
    {
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=TestPage.pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);

        MemoryStream msOutput = new MemoryStream();
        TextReader reader = new StringReader(HtmlContent);

        // step 1: creation of a document-object
        Document document = new Document(PageSize.A4, 30, 30, 30, 30);
        HTMLWorker worker = new HTMLWorker(document);
        // step 2:
        // we create a writer that listens to the document
        // and directs a XML-stream to a file
        PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream);

        // step 3: we create a worker parse the document

        // step 4: we open document and start the worker on the document
        document.Open();
        worker.StartDocument();

        // step 5: parse the html into the document
        worker.Parse(reader);

        // step 6: close the document and the worker
        worker.EndDocument();
        worker.Close();
        document.Close();
        //Response.Write(document);
        //Response.End();

    }
    protected override void Render(HtmlTextWriter writer)
    {
        // setup a TextWriter to capture the markup
        TextWriter tw = new StringWriter();
        HtmlTextWriter htw = new HtmlTextWriter(tw);

        // render the markup into our surrogate TextWriter
        base.Render(htw);

        // get the captured markup as a string
        string pageSource = tw.ToString();

        // render the markup into the output stream verbatim
        writer.Write(pageSource);

        // remove the viewstate field from the captured markup
        HtmlContent = Regex.Replace(pageSource,
            "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\".*?\" />",
            "", RegexOptions.IgnoreCase);

        // the page source, without the viewstate field, is in viewStateRemoved
        // do what you like with it

    }

Por favor ayuda . También tengo otra opción, que es mostrar la imagen de la página web completa cuando hago clic en un botón. ¿Alguien puede guiarme a las direcciones posibles para estos dos problemas, por favor?

Finalmente cambié mi código como:

        Response.ContentType = "application/msword";
        Response.AddHeader("content-disposition", "attachment;filename=TestPage.doc");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        MemoryStream msOutput = new MemoryStream();

Con esto, puedo obtener el documento msword que contiene todos mis controles, pero también recibo algunos textos no deseados, ¿cómo puedo eliminar eso, si alguien encontró el mismo problema?

preguntado el 03 de mayo de 12 a las 14:05

Estoy utilizando wkhtmltopdf en uno de mis proyectos para generar un PDF basado en una página web. -

¿Puedo obtener los controles de Telerik también en ese pdf?

No estoy seguro, pero supongo que no. -

He modificado aún más mi pregunta, por favor ayuda con eso -

3 Respuestas

Después de algunas investigaciones, no encontré ninguna solución para mostrar los controles en el html, este código a continuación funciona bien, pero sin mostrar los controles, en el pasado usé esto http://www.winnovative-software.com/ y funciona bien para páginas html, incluidos todos los controles, también puede probarlo en línea, el "único" problema es que debe pagar la licencia

protected void btnExportToPdf_Click(object sender, EventArgs e)
    {
        renderPDF = true;
    }

    protected override void Render(HtmlTextWriter writer)
    {           
        if (renderPDF == true)
        {
            MemoryStream mem = new MemoryStream();
            StreamWriter twr = new StreamWriter(mem);
            HtmlTextWriter myWriter = new HtmlTextWriter(twr);
            base.Render(myWriter);
            myWriter.Flush();
            myWriter.Dispose();
            StreamReader strmRdr = new StreamReader(mem);
            strmRdr.BaseStream.Position = 0;
            string pageContent = strmRdr.ReadToEnd();
            strmRdr.Dispose();
            mem.Dispose();
            writer.Write(pageContent);
            CreatePDFDocument(pageContent);
        }
        else
        {
            StringBuilder sb = new StringBuilder();
            HtmlTextWriter tw = new HtmlTextWriter(new System.IO.StringWriter(sb));
            base.Render(tw);
            // get the captured markup as a string
            string pageSource = tw.ToString();
            //Get the rendered content
            string sContent = sb.ToString();
            //Now output it to the page, if you want
            writer.Write(sContent);
        }
    }

    public void CreatePDFDocument(string strHtml)
    {


        string strHTMLpath = Server.MapPath("MyHTML.html");
        StreamWriter strWriter = new StreamWriter(strHTMLpath, false, Encoding.UTF8);
        strWriter.Write(strHtml);
        strWriter.Close();
        string strFileName = HttpContext.Current.Server.MapPath("map1.pdf"); //    strFileName    "C:\\Inetpub\\wwwroot\\Test\\map1.pdf" 
        // step 1: creation of a document-object
        Document document = new Document();
        // step 2:
        // we create a writer that listens to the document
        PdfWriter.GetInstance(document, new FileStream(strFileName, FileMode.Create));
        StringReader se = new StringReader(strHtml);
        TextReader tr = new StreamReader(Server.MapPath("MyHTML.html"));

        //add the collection to the document
        document.Open();                        
        /////////
        iTextSharp.text.html.simpleparser.HTMLWorker worker = new iTextSharp.text.html.simpleparser.HTMLWorker(document);

        worker.StartDocument();

        //// step 5: parse the html into the document
        worker.Parse(tr);

        //// step 6: close the document and the worker
        worker.EndDocument();

        //worker.Parse(tr); // getting error "Illegal characters in path"
        document.Close();
        ShowPdf(strFileName);
    }
    public void ShowPdf(string strFileName)
    {
        Response.ClearContent();
        Response.ClearHeaders();
        Response.AddHeader("Content-Disposition", "inline;filename=" + strFileName);
        Response.ContentType = "application/pdf";
        Response.WriteFile(strFileName);
        Response.Flush();
        Response.Clear();
    }   

contestado el 06 de mayo de 12 a las 10:05

Una búsqueda muy simple en Google nos lleva al siguiente hilo del foro que tiene su "solución": http://forums.asp.net/t/1039486.aspx/1

contestado el 03 de mayo de 12 a las 14:05

iTextSharp viene con un pequeño compañero: Trabajador XML

Para una demostración, echa un vistazo aquí

A pesar de que el documentación se refiere a la API de Java, la adaptación a C# debería ser sencilla.

En cuanto a las etiquetas Telerik/ASP, puede ampliar XMLWorker y definir cómo convertir dichas etiquetas en elementos PDF.

contestado el 03 de mayo de 12 a las 14:05

He modificado aún más mi pregunta, por favor ayuda con eso - Nair Vipin

Has añadido una nueva pregunta a la original. Deberías haber creado una nueva pregunta para eso. - Alexis paloma

Lo siento, pero ¿pueden ayudarme con eso? Publicaré una nueva pregunta: Nair Vipin

Aquí está mi nueva pregunta- stackoverflow.com/questions/10445049/… - Nair Vipin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.