将sharepoint页面转换为pdf时,该文档没有页面异常

时间:2015-02-01 07:58:26

标签: c# itextsharp sharepoint-2013

使用itextSharp和sharepoint visual webpart编码我将当前的aspx页面转换为pdf,但我无法转换。我发现问题出在这一行" this.Page.RenderControl(hw)"如果我对此行发表评论,我会得到"该文档没有页面"例外情况如果我取消注释这行,我得到"一个页面只能有一个服务器端表单标签"错误。我怎么处理这个?请有人帮助我..

protected void BtnSubmit_Click(object sender, EventArgs e)
{
 try
         {
            HttpContext.Current.Response.ContentType = "application/pdf";
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=UserDetails.pdf");
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            StringWriter sw = new StringWriter(); 
            HtmlTextWriter hw = new HtmlTextWriter(sw); 

            //this.Page.RenderControl(hw);

            StringReader sr = new StringReader(sw.ToString());
            Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 100f, 0.0f);
            HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
            PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);
            pdfDoc.Open();
            htmlparser.Parse(sr);
            pdfDoc.Close();
            HttpContext.Current.Response.Write(pdfDoc);
            HttpContext.Current.Response.End();


            }
        catch (Exception exp)
            {


            } 
 }

protected override void Render(HtmlTextWriter writer)
    {
        // Ensure that the control is nested in a server form.
        if (Page != null)
        {
            Page.VerifyRenderingInServerForm(this);
        }
        base.Render(writer);
   }

2 个答案:

答案 0 :(得分:1)

由于ASP.NET Web表单页面生命周期的工作方式(sharepoint非常相似),您需要将PDF生成代码移动到Render阶段。 IIRC,这就是为什么你看到" A页面只能有一个服务器端表格标签"例外 - 按钮点击事件处理程序中的Page.RenderControl()调用位于Render()阶段之前,基本上会导致两次呈现页面内容。

无论如何,这是一个简单的工作示例,使用XMLWorker来帮助您入门:

首先确保包含这些名称空间:

    using iTextSharp.text;
    using iTextSharp.text.pdf;
    using iTextSharp.text.xml;
    using iTextSharp.tool.xml;

然后:

// flag when  page renders normally / when you're sending PDF
      private bool _convertToPdf;
// set _convertToPdf in your BtnSubmit_Click() - I never use AutoEventWireup
      public void ProcessPage(object sender, CommandEventArgs e) {
          _convertToPdf = true;
      }

      protected override void Render(HtmlTextWriter writer) {
        if (!_convertToPdf) { base.Render(writer); }
        else {
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-disposition", "attachment;filename=thisPage.pdf");
            var sb = new StringBuilder();
            using (var sw = new StringWriter(sb)) {
                using (var htmlTextWriter = new HtmlTextWriter(sw)) {
                    base.Render(htmlTextWriter);
                    using (var document = new Document()) {
                        var pdfWriter = PdfWriter.GetInstance(document, Response.OutputStream);
                        document.Open();
                        using (var stringReader = new StringReader(sb.ToString())) {
                            XMLWorkerHelper.GetInstance().ParseXHtml(
                                pdfWriter, document, stringReader
                            );
                        }
                    }
                }
            }
            Response.End();        
        }

对于与您的aspx页面相比,PDF显示的效果并不高。 iTextSharp并不是一个完整的HTML到PDF转换器。

答案 1 :(得分:0)

您需要添加以下行:

StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
printableArea.RenderControl(hw); // Here printable area is nothing but div on aspx page with id and runaat="server" tag.

StringReader sr = new StringReader(sw.ToString());
 string strHtml = sr.ReadToEnd();
 sr.Close();