How to Start Tutorials Troubleshooting Main Operations Convert PDF Read PDF Edit PDF PDF Report Generator Work with PDF Modules PDF Document PDF Pages Text Image Graph & Path Annotation, Markup & Drawing Redaction Security Digital Signature Forms Watermark Bookmark Link File Attachment File Metadata Printing Work with Other SDKs Barcode read Barcode create OCR Twain

Using C# PDF Generator Library
How to create, generate a table in PDF file with xml template applied in C#, windows application

C# Demo Code to add a table with table template applied to adobe pdf file

In the following C# tutorial, you will learn how to create a PDF with table programmatically with XML template applied in your C# ASP.NET Web application and Windows application.

  • Design data class
  • Prepare the template XML configure file
  • Load the sample data
  • Generate PDF report file from database with template applied

How to create a PDF with template applied using C#

  1. Download XDoc.PDF Generator C# library
  2. Install C# library to create PDF file with XML template
  3. Step by Step Tutorial

In the following C# tutorial, you will learn how to generate a PDF with table programmatically with XML template applied in C#. After the guide steps finished, you will generate a PDF report below.

1. Design data class for customer data

In the following C# source code, you will learn how to design the table data.

public class Sample1TableDef
    //  Must list all properties of the Header tag in the XML file. (Name must be identity.)
    public const String WeeklySalesRecord_ProductNo = "Product No";
    public const String WeeklySalesRecord_ProductCode = "Product Code";
    public const String WeeklySalesRecord_ProductName = "Product Name";
    public const String WeeklySalesRecord_MondayCount = "Monday Count";
    public const String WeeklySalesRecord_TuesdayCount = "Tuesday Count";
    public const String WeeklySalesRecord_WednesdayCount = "Wednesday Count";
    public const String WeeklySalesRecord_ThursdayCount = "Thursday Count";
    public const String WeeklySalesRecord_FridayCount = "Friday Count";
    public const String WeeklySalesRecord_SaturdayCount = "Saturday Count";
    public const String WeeklySalesRecord_SundayCount = "Sunday Count";
    public const String WeeklySalesRecord_TotalCount = "Total Count";

    // Must list all styles in the Style tag. (Name must be identity.)
    public const String StyleID_Body_Default = "BodyDefault";
    public const String StyleID_Head_Default = "HeaderDefault";

    public static String GetHeaderType(PropEntry entry)
        return Sample1TableDef.StyleID_Head_Default;
public class WeeklySalesRecord : ValueEntry
    private String _num;
    private String _code;
    private String _product;

    private String _mon;
    private String _tue;
    private String _wed;
    private String _thu;
    private String _fri;
    private String _sat;
    private String _sun;

    private String _total;

    public WeeklySalesRecord(String num, String code, String product,
                             String mon, String tue, String wed, String thu, String fri, String sat, String sun,
                             String total)
        : base()
        this._num = num;
        this._code = code;
        this._product = product;
        this._mon = mon;
        this._tue = thu;
        this._wed = wed;
        this._thu = thu;
        this._fri = fri;
        this._sat = sat;
        this._sun = sun;
        this._total = total;

        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_ProductNo, this._num, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_ProductCode, this._code, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_ProductName, this._product, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_MondayCount, this._mon, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_TuesdayCount, this._tue, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_WednesdayCount, this._wed, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_ThursdayCount, this._thu, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_FridayCount, this._fri, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_SaturdayCount, this._sat, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_SundayCount, this._sun, 1);
        AddPropertyEntry(Sample1TableDef.WeeklySalesRecord_TotalCount, this._total, 1);

    public override string GetStyleID(PropEntry entry, TableState state)
        return Sample1TableDef.StyleID_Body_Default;

2. Prepare table template configure file (.xml)

Here you will customize the report data table

<?xml version="1.0" encoding="utf-8" ?>
  <Settings TableWidth="500" RelativeWidth="0.04 0.08 0.15 0.09 0.09 0.09 0.09 0.09 0.09 0.09 0.10" />
    <Property Name="Product No" Content="No" ColspanNum="1" RowspanNum="1" />
    <Property Name="Product Code" Content="Code" ColspanNum="1" RowspanNum="1" />
    <Property Name="Product Name" Content="Product" ColspanNum="1" RowspanNum="1" />
    <Property Name="Monday Count" Content="Mon" ColspanNum="1" RowspanNum="1" />
    <Property Name="Tuesday Count" Content="Tue" ColspanNum="1" RowspanNum="1" />
    <Property Name="Wednesday Count" Content="Wed" ColspanNum="1" RowspanNum="1" />
    <Property Name="Thursday Count" Content="Thu" ColspanNum="1" RowspanNum="1" />
    <Property Name="Friday Count" Content="Fri" ColspanNum="1" RowspanNum="1" />
    <Property Name="Saturday Count" Content="Sat" ColspanNum="1" RowspanNum="1" />
    <Property Name="Sunday Count" Content="Sun" ColspanNum="1" RowspanNum="1" />
    <Property Name="Total Count" Content="Total" ColspanNum="1" RowspanNum="1" />
    <Style ID="BodyDefault">
      <!--FontStyle valid value: [Regular|Bold|Italic|BoldItalic]-->
    <Style ID="HeaderDefault">
      <!--FontStyle valid value: [Regular|Bold|Italic|BoldItalic]-->

3. Prepare sample data

Here we have prepared the sample dataset. You can also load the real data from database in your C# ASP.NET, Windows application.

public class Sample1Database
public static String[] datas = new String[] {

public static List<ValueEntry> CreateTableEntries()
    List<ValueEntry> values = new List<ValueEntry>();

    foreach (String data in datas)
        String[] tmps = data.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
        if (tmps.Length < 11) continue;

        values.Add(new WeeklySalesRecord(tmps[0], tmps[1], tmps[2],
                                         tmps[3], tmps[4], tmps[5], tmps[6], tmps[7], tmps[8], tmps[9],

    return values;

4. Create document with the table

The C# source code below, you will learn how to create a new PDF report file from dataset, with report template applied.

String outputFilePath = Program.OutputFolder + "\\" + OutputFileName;

Document doc = new Document();
PDFBuildHandler.Create(doc, outputFilePath);


Paragraph p = new Paragraph("Weekly Sales Report");
p.Alignment = Alignment.ALIGN_CENTER;
p.TextFont = new Font(Font.FontFamily.TimesRoman, 36F, Font.FontStyle.Bold, Color.Black);
p.SpacingAfter = 36;

Paragraph p1 = new Paragraph("Sales Name/Store: ");
p1.TextFont = new Font(Font.FontFamily.Helvetica, 16F, Font.FontStyle.Regular, Color.Black);

Paragraph p2 = new Paragraph("Week Period: ");
p2.TextFont = new Font(Font.FontFamily.Helvetica, 16F, Font.FontStyle.Regular, Color.Black);
p2.SpacingAfter = 12;


private static void addTable(Document doc)
    String xmlFilePath = Program.OutputFolder + "\\" + TableTemplateXMLFileName;
    TabelTemplate tableTemplate = TabelTemplate.LoadTemplate(xmlFilePath);


    List<ValueEntry> values = Sample1Database.CreateTableEntries();
    foreach (ValueEntry value in values)


Let's see the result of adding a table with template: