Generating html to pdf using itextsharp

26,351

i don't think HTMLWorker (iTextSharp) supports table widths yet.

so you need to:

  1. parse your HTML to find the columns widths - use a regular expression or something like Html Agility Pack.

  2. call HTMLWorker.ParseToList() to iterate over iText elements and look for PdfPTable(s)

  3. manually set the PdfPTable width by calling SetWidthPercentage()

here's an example (excluding step 1) using a HTTP handler:

<%@ WebHandler Language='C#' Class='tableColumnWidths' %>
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;

public class tableColumnWidths : IHttpHandler {
  public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "application/pdf";
    string html = @"
<html><head></head><body> 
<p>A paragraph</p>   
<table border='1'>
<tr><td>row1-column1</td><td>row1-column2</td><td>row1-column3</td></tr>
<tr><td>row2-column1</td><td>row2-column2</td><td>row2-column3</td></tr>
</table>
</body></html>
    ";
/*
 * need the Rectangle for later when we set the column widths
 */
    Rectangle rect = PageSize.LETTER;
    Document document = new Document(rect);
    PdfWriter.GetInstance(document, context.Response.OutputStream);
    document.Open();
/* 
 * iterate over iText elements
 */
    List<IElement> ie = HTMLWorker.ParseToList(
      new StringReader(html), null
    );
/*
 * page width
 */
    float pageWidth = rect.Width;
/*
 * look for PdfPTable(s)
 */
    foreach (IElement element in ie) {
      PdfPTable table = element as PdfPTable;
/*
 * set the column widths
 */
      if (table != null) {
        table.SetWidthPercentage(
          new float[] {
            (float).25 * pageWidth, 
            (float).50 * pageWidth, 
            (float).25 * pageWidth
          },
          rect
        );
      }
      document.Add(element); 
    } 
    document.Close();  
  }
  public bool IsReusable {
    get { return false; }
  }
}
Share:
26,351
Ishan
Author by

Ishan

Hello i am into ASP.net C#/ Sharepoint development and constantly learning in order to expertise in the field.

Updated on April 26, 2020

Comments

  • Ishan
    Ishan about 4 years
    public void pdfgenforffd(TextBox TextBox3, HiddenField HiddenField1, HiddenField HiddenField4, AjaxControlToolkit.HTMLEditor.Editor Editor1)
    {
    
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ContentType = "application/pdf";
        // Create PDF document
        Document pdfDocument = new Document(PageSize.A4, 50, 25, 15, 10);
    
        PdfWriter wri = PdfWriter.GetInstance(pdfDocument, new FileStream("d://" + HiddenField1.Value + "_" + HiddenField4.Value + ".pdf", FileMode.Create));
    
        PdfWriter.GetInstance(pdfDocument, HttpContext.Current.Response.OutputStream);
    
        pdfDocument.Open();
        string htmlText = Editor1.Content;
        //string htmlText = htmlText1.Replace(Environment.NewLine, "<br/>");
    
        HTMLWorker htmlWorker = new HTMLWorker(pdfDocument);
    
        htmlWorker.Parse(new StringReader(htmlText));
    
    
        pdfDocument.Close();
        HttpContext.Current.Response.End();
    }
    

    i am using the above code for pdf generation from html text in HTMLEditor(ajax control). If i hardcode a table with each column of different width, into HTMLEditor text than while generating pdf the column get devided equally i.e all column have fixed size on pdf even if i specify some custom width for each column.

    I want to generate pdf that can convert html to pdf,also divide table column with specified width. How to do it?

  • Ishan
    Ishan about 13 years
    I did not understand how to use step1 in my program.
  • kuujinbo
    kuujinbo about 13 years
    if you don't show the HTML you are trying to convert no one can help you.
  • Ishan
    Ishan about 13 years
    the html content is taken from HTMLEditor (ajax control),so user can modify the content in HTML.
  • kuujinbo
    kuujinbo about 11 years
    @LyubenTodorov: Thanks for that! :) The same happens with many other good questions/answers with different tags throughout stackoverflow, so it's OK with me.