【问题标题】:Displaying a web page as a pdf with click of a button通过单击按钮将网页显示为 pdf
【发布时间】:2012-05-13 00:00:30
【问题描述】:

我有一个新要求,即在我的网页中有一个按钮,点击后,它会将网页显示为 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 文档,但我也得到了一些不需要的文本,如果有人遇到同样的问题,我该如何删除?

【问题讨论】:

  • 我在我的一个项目中使用wkhtmltopdf基于网页生成PDF。
  • 我可以在那个pdf中获得telerik控件吗
  • 不确定,但我猜不会。
  • 我已经进一步修改了我的问题,请帮忙

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    iTextSharp 自带小伙伴:XML Worker

    如需演示,请查看here

    尽管documentation 指的是Java API,但对C# 的适配应该很简单。

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

    【讨论】:

    • 我已经进一步修改了我的问题,请帮忙
    • 您在原来的问题上添加了一个新问题。您应该为此创建一个新问题。
    • 对不起,你能帮我解决这个问题吗?我会发布一个新问题
    【解决方案3】:

    经过一些研究,我没有找到在 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();
        }   
    

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多