2012-06-28 3 views
0

Я использую эту dll iTextSharp 5.3.0 для создания pdf-файла. Есть ли способ конвертировать полную .aspx страницу в pdf? На моей странице есть сетки и код на стороне сервера.aspx to pdf using itextSharp 5.3.0

Это мой код:

защищен недействительным Button1_Click (объект отправителя, EventArgs е) {

createPDF(Server.MapPath("Default.aspx")); 

} 


private void createPDF(string html) 
{ 


    TextReader reader = new StringReader(html); 

    // step 1: creation of a document-object 
    Document document = new Document(PageSize.A4, 30, 30, 30, 30); 

    // step 2: 
    // we create a writer that listens to the document 
    // and directs a XML-stream to a file 
    PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("c://test.pdf", FileMode.Create)); 


    HTMLWorker worker = new HTMLWorker(document); 

    document.Open(); 
    worker.StartDocument(); 
    List<IElement> p = HTMLWorker.ParseToList(new StreamReader(html), new StyleSheet()); 
    for (int k = 0; k < p.Count; k++) 
    { 
     document.Add((IElement)p[k]); 
    } 



    worker.EndDocument(); 
    worker.Close(); 
    document.Close(); 

} 

Это работает, но файл test.pdf это просто текст. Html не интерпретируется хорошо, мои сетки отсутствуют, и мои значения на стороне сервера (значения из сеток) также отсутствуют. Я также попытался коды отсюда: http://forums.asp.net/t/1199774.aspx и здесь: Problem with HTMLParser in Itextsharp

Заранее спасибо!

ответ

0

Это мой честный совет! Не тратьте свое время на HTMLWorker.ParseToList. Он имеет очень простой HTML-парсер. Попробуйте эту упаковку, и вы никогда не оглянетесь назад! https://github.com/pruiz/WkHtmlToXSharp

+0

Спасибо за ваш ответ VahidN. Я, наконец, использовал wkhtmltopdf, и он работает отлично. Он использует webkit для рендеринга pdf, поэтому pdf выглядит точно так же, как на веб-странице. – user1482442

0

ITextSharp только делает встроенный css, он создает проблемы при добавлении файлов CSS.

  System.Web.HttpContext.Current.Response.ContentType = "application/pdf"; 
      System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=BookingDetails.pdf"); 
      System.Web.HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      StringWriter sw = new StringWriter(); 
      HtmlTextWriter hw = new HtmlTextWriter(sw); 

      this.CreateBookingMainDiv.RenderControl(hw); 

      StringReader sr = new StringReader(sw.ToString()); 
      Document pdfDoc = new Document(new Rectangle(922,1296),7f,7f,7f,0f); 

      PdfWriter writer = PdfWriter.GetInstance(pdfDoc, System.Web.HttpContext.Current.Response.OutputStream); 

      pdfDoc.Open(); 

      //HtmlPipeline 

      CssAppliers ca = new CssAppliersImpl(); 
      //ICssFile cfile = new CssFileProcessor(); 
      HtmlPipelineContext htmlContext = new HtmlPipelineContext(ca); 
      htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 
      //CSS stuff 

      //var cssResolver = new StyleAttrCSSResolver(); 
      //var DamcoCss = XMLWorkerHelper.GetCSS(new FileStream(HttpContext.Current.Server.MapPath("~/css/damco.css"), FileMode.Open)); 
      ICssFile cfile = new CssFileImpl(); 

      ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true); 

      //String DamcoCss = HttpContext.Current.Server.MapPath("~/css/damco.css"); 
      //String BootStrapCss = HttpContext.Current.Server.MapPath("~/css/bootstrap.css"); 
      //String BootStrapCssTheme = HttpContext.Current.Server.MapPath("~/css/bootstrap-theme.css"); 

      //Add the external CSS file   

      //cssResolver.AddCssFile(DamcoCss, true); 
      //cssResolver.AddCssFile(BootStrapCss, true); 
      //cssResolver.AddCssFile(BootStrapCssTheme, true); 

      //Pipeline 
      IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(pdfDoc, writer))); 
      //XMLWorker 
      XMLWorker worker = new XMLWorker(pipeline, true); 
      //and...we parse 
      XMLParser parser = new XMLParser(true, worker); 
      //parser.AddListener(worker); 
      parser.Parse(sr); 
      parser.Flush(); 
      pdfDoc.Close(); 

      System.Web.HttpContext.Current.Response.Write(pdfDoc); 
      System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(); 
      //System.Web.HttpContext.Current.Response.End(); 

Используйте XMLWorker вместо HTMLWorker. работает как шарм.

Смежные вопросы