单击按钮将网页显示为pdf

时间:2012-05-03 13:01:07

标签: asp.net telerik pdf-generation itextsharp webpage

我有一个新要求,即在我的网页上有一个按钮,点击后,它会将网页显示为PDF。在研究中,我发现iTextSharp用于此目的。 但我的网页上也有很多Telerik和ASP控件。我可以使用iTextSharp吗?

在PDF中获得

如果是,那么任何人都可以提供一个基本链接来开始使用iTextSharp,因为我还没有遇到过这个工具。

根据@ahaliav的回答,我尝试使用以下代码。但是,我没有得到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

    }

请帮忙。 我还有其他选项,那就是当我点击一个按钮时显示完整网页的图像。任何人都可以指导我找到这两个问题的任何可能的方向。

我终于将我的代码更改为:

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

有了这个我能够获得包含我所有控件的msword文档,但我也得到了一些不需要的文本,如果有人遇到同样的问题,我怎么能删除它?

3 个答案:

答案 0 :(得分:1)

一个非常简单的Google搜索将我们带到以下论坛帖子中,其中包含您的“sollution”: http://forums.asp.net/t/1039486.aspx/1

答案 1 :(得分:1)

经过一些研究后,我没有找到任何解决方案来显示html中的控件,下面的代码工作正常,但没有显示控件, 在过去,我使用了这个http://www.winnovative-software.com/,它适用于html页面,包括所有控件,你也可以测试它,“唯一”问题是你需要支付许可证

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

答案 2 :(得分:0)

iTextSharp附带一个小伙伴:XML Worker

要进行演示,请查看here

即使documentation引用了Java API,对C#的适应也应该是直截了当的。

对于Telerik / ASP标记,您可以扩展XMLWorker并定义如何将此类标记转换为PDF元素。

相关问题