The sample demonstrates how to draw nested table in PDF document and set table row&cell format.
Download Grid.pdf
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Grid;
namespace Grid
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Create a pdf document.
PdfDocument doc = new PdfDocument();
//margin
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
PdfMargins margin = new PdfMargins();
margin.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margin.Bottom = margin.Top;
margin.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margin.Right = margin.Left;
// Create one page
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4, margin, PdfPageRotateAngle.RotateAngle0, PdfPageOrientation.Landscape);
float y = 10;
float x1 = page.Canvas.ClientSize.Width;
//title
PdfBrush brush1 = PdfBrushes.Black;
PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial", 16f, FontStyle.Bold), true);
PdfStringFormat format1 = new PdfStringFormat(PdfTextAlignment.Center);
page.Canvas.DrawString("Vendor List", font1, brush1, page.Canvas.ClientSize.Width / 2, y, format1);
y = y + font1.MeasureString("Vendor List", format1).Height;
y = y + 5;
String[] data
= {
"VendorName;Address1;City;State;Country",
"Cacor Corporation;161 Southfield Rd;Southfield;OH;U.S.A.",
"Underwater;50 N 3rd Street;Indianapolis;IN;U.S.A.",
"J.W. Luscher Mfg.;65 Addams Street;Berkely;MA;U.S.A.",
"Scuba Professionals;3105 East Brace;Rancho Dominguez;CA;U.S.A.",
"Divers' Supply Shop;5208 University Dr;Macon;GA;U.S.A.",
"Techniques;52 Dolphin Drive;Redwood City;CA;U.S.A.",
"Perry Scuba;3443 James Ave;Hapeville;GA;U.S.A.",
"Beauchat, Inc.;45900 SW 2nd Ave;Ft Lauderdale;FL;U.S.A.",
"Amor Aqua;42 West 29th Street;New York;NY;U.S.A.",
"Aqua Research Corp.;P.O. Box 998;Cornish;NH;U.S.A.",
"B&K Undersea Photo;116 W 7th Street;New York;NY;U.S.A.",
"Diving International Unlimited;1148 David Drive;San Diego;DA;U.S.A.",
"Nautical Compressors;65 NW 167 Street;Miami;FL;U.S.A.",
"Glen Specialties, Inc.;17663 Campbell Lane;Huntington Beach;CA;U.S.A.",
"Dive Time;20 Miramar Ave;Long Beach;CA;U.S.A.",
"Undersea Systems, Inc.;18112 Gotham Street;Huntington Beach;CA;U.S.A.",
"Felix Diving;310 S Michigan Ave;Chicago;IL;U.S.A.",
"Central Valley Skin Divers;160 Jameston Ave;Jamaica;NY;U.S.A.",
"Parkway Dive Shop;241 Kelly Street;South Amboy;NJ;U.S.A.",
"Marine Camera & Dive;117 South Valley Rd;San Diego;CA;U.S.A.",
"Dive Canada;275 W Ninth Ave;Vancouver;British Columbia;Canada",
"Dive & Surf;P.O. Box 20210;Indianapolis;IN;U.S.A.",
"Fish Research Labs;29 Wilkins Rd Dept. SD;Los Banos;CA;U.S.A."
};
PdfGrid grid = new PdfGrid();
grid.Style.CellPadding = new PdfPaddings(1, 1, 1, 1);
String[] header = data[0].Split(';');
grid.Columns.Add(header.Length);
float width
= page.Canvas.ClientSize.Width - (grid.Columns.Count + 1);
grid.Columns[0].Width = width * 0.25f;
grid.Columns[1].Width = width * 0.25f;
grid.Columns[2].Width = width * 0.25f;
grid.Columns[3].Width = width * 0.15f;
grid.Columns[4].Width = width * 0.10f;
PdfGridRow headerRow = grid.Headers.Add(1)[0];
headerRow.Style.Font = new PdfTrueTypeFont(new Font("Arial", 11f, FontStyle.Bold), true);
headerRow.Style.BackgroundBrush
= new PdfLinearGradientBrush(new PointF(0, 0), new PointF(x1, 0), Color.Red, Color.Blue);
for (int i = 0; i < header.Length; i++)
{
headerRow.Cells[i].Value = header[i];
headerRow.Cells[i].StringFormat
= new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
if (i == 0)
{
headerRow.Cells[i].Style.BackgroundBrush = PdfBrushes.Gray;
}
}
Random random = new Random();
Dictionary groupByCountry = new Dictionary();
for (int r = 1; r < data.Length; r++)
{
PdfGridRow row = grid.Rows.Add();
row.Style.Font = new PdfTrueTypeFont(new Font("Arial", 10f), true);
byte[] buffer = new byte[6];
random.NextBytes(buffer);
PdfRGBColor color1 = new PdfRGBColor(buffer[0], buffer[1], buffer[2]);
PdfRGBColor color2 = new PdfRGBColor(buffer[3], buffer[4], buffer[5]);
row.Style.BackgroundBrush
= new PdfLinearGradientBrush(new PointF(0, 0), new PointF(x1, 0), color1, color2);
String[] rowData = data[r].Split(';');
for (int c = 0; c < rowData.Length; c++)
{
row.Cells[c].Value = rowData[c];
if (c == 0)
{
row.Cells[c].Style.BackgroundBrush = PdfBrushes.Gray;
}
if(c < 3)
{
row.Cells[c].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
}
else
{
row.Cells[c].StringFormat = new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle);
}
if (c == 4)
{
if (groupByCountry.ContainsKey(rowData[c]))
{
groupByCountry[rowData[c]] = groupByCountry[rowData[c]] + 1;
}
else
{
groupByCountry[rowData[c]] = 1;
}
}
}
}
StringBuilder totalAmount = new StringBuilder();
foreach (KeyValuePair country in groupByCountry)
{
totalAmount.AppendFormat("{0}:\t{1}", country.Key, country.Value);
totalAmount.AppendLine();
}
PdfGridRow totalAmountRow = grid.Rows.Add();
totalAmountRow.Style.BackgroundBrush = PdfBrushes.Plum;
totalAmountRow.Cells[0].Value = "Total Amount";
totalAmountRow.Cells[0].Style.Font = new PdfTrueTypeFont(new Font("Arial", 10f, FontStyle.Bold), true);
totalAmountRow.Cells[0].StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
totalAmountRow.Cells[1].ColumnSpan = 4;
totalAmountRow.Cells[1].Value = totalAmount.ToString();
totalAmountRow.Cells[1].Style.Font = new PdfTrueTypeFont(new Font("Arial", 10f, FontStyle.Bold | FontStyle.Italic), true);
totalAmountRow.Cells[1].StringFormat = new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle);
//append product list
PdfGrid productList = new PdfGrid();
productList.Style.Font = new PdfTrueTypeFont(new Font("Arial", 8f), true);
using (OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\..\..\..\..\Data\demo.mdb";
OleDbCommand command = new OleDbCommand();
command.CommandText
= " select p.Description "
+ " from vendors v "
+ " inner join parts p "
+ " on v.VendorNo = p.VendorNo "
+ " where v.VendorName = 'Cacor Corporation'";
command.Connection = conn;
using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command))
{
DataTable dataTable = new DataTable();
dataAdapter.Fill(dataTable);
productList.DataSource = dataTable;
}
}
productList.Headers[0].Cells[0].Value = "Cacor Corporation";
productList.Headers[0].Cells[0].Style.Font = new PdfTrueTypeFont(new Font("Arial", 8f, FontStyle.Bold), true);
productList.Headers[0].Cells[0].Style.Borders.All = new PdfPen(new PdfTilingBrush(new SizeF(1, 1)), 0);
grid.Rows[0].Cells[0].Value = productList;
grid.Rows[0].Cells[0].StringFormat.Alignment = PdfTextAlignment.Left;
PdfLayoutResult result = grid.Draw(page, new PointF(0, y));
y = y + result.Bounds.Height + 5;
PdfBrush brush2 = PdfBrushes.Gray;
PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial", 9f));
result.Page.Canvas.DrawString(String.Format("* All {0} vendors in the list", grid.Rows.Count - 1),
font2, brush2, 5, y);
//Save pdf file.
doc.SaveToFile("Grid.pdf");
doc.Close();
//Launching the Pdf file.
PDFDocumentViewer("Grid.pdf");
}
private void PDFDocumentViewer(string fileName)
{
try
{
System.Diagnostics.Process.Start(fileName);
}
catch { }
}
}
}
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.OleDb
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Grid
Namespace Grid
Public Partial Class Form1
Inherits Form
Public Sub New()
InitializeComponent()
End Sub
Private Sub button1_Click(sender As Object, e As EventArgs)
'Create a pdf document.
Dim doc As New PdfDocument()
'margin
Dim unitCvtr As New PdfUnitConvertor()
Dim margin As New PdfMargins()
margin.Top = unitCvtr.ConvertUnits(2.54F, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Bottom = margin.Top
margin.Left = unitCvtr.ConvertUnits(3.17F, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Right = margin.Left
' Create one page
Dim page As PdfPageBase = doc.Pages.Add(PdfPageSize.A4, margin, PdfPageRotateAngle.RotateAngle0, PdfPageOrientation.Landscape)
Dim y As Single = 10
Dim x1 As Single = page.Canvas.ClientSize.Width
'title
Dim brush1 As PdfBrush = PdfBrushes.Black
Dim font1 As New PdfTrueTypeFont(New Font("Arial", 16F, FontStyle.Bold), True)
Dim format1 As New PdfStringFormat(PdfTextAlignment.Center)
page.Canvas.DrawString("Vendor List", font1, brush1, page.Canvas.ClientSize.Width / 2, y, format1)
y = y + font1.MeasureString("Vendor List", format1).Height
y = y + 5
Dim data As [String]() = {"VendorName;Address1;City;State;Country", "Cacor Corporation;161 Southfield Rd;Southfield;OH;U.S.A.", "Underwater;50 N 3rd Street;Indianapolis;IN;U.S.A.", "J.W. Luscher Mfg.;65 Addams Street;Berkely;MA;U.S.A.", "Scuba Professionals;3105 East Brace;Rancho Dominguez;CA;U.S.A.", "Divers' Supply Shop;5208 University Dr;Macon;GA;U.S.A.", _
"Techniques;52 Dolphin Drive;Redwood City;CA;U.S.A.", "Perry Scuba;3443 James Ave;Hapeville;GA;U.S.A.", "Beauchat, Inc.;45900 SW 2nd Ave;Ft Lauderdale;FL;U.S.A.", "Amor Aqua;42 West 29th Street;New York;NY;U.S.A.", "Aqua Research Corp.;P.O. Box 998;Cornish;NH;U.S.A.", "B&K Undersea Photo;116 W 7th Street;New York;NY;U.S.A.", _
"Diving International Unlimited;1148 David Drive;San Diego;DA;U.S.A.", "Nautical Compressors;65 NW 167 Street;Miami;FL;U.S.A.", "Glen Specialties, Inc.;17663 Campbell Lane;Huntington Beach;CA;U.S.A.", "Dive Time;20 Miramar Ave;Long Beach;CA;U.S.A.", "Undersea Systems, Inc.;18112 Gotham Street;Huntington Beach;CA;U.S.A.", "Felix Diving;310 S Michigan Ave;Chicago;IL;U.S.A.", _
"Central Valley Skin Divers;160 Jameston Ave;Jamaica;NY;U.S.A.", "Parkway Dive Shop;241 Kelly Street;South Amboy;NJ;U.S.A.", "Marine Camera & Dive;117 South Valley Rd;San Diego;CA;U.S.A.", "Dive Canada;275 W Ninth Ave;Vancouver;British Columbia;Canada", "Dive & Surf;P.O. Box 20210;Indianapolis;IN;U.S.A.", "Fish Research Labs;29 Wilkins Rd Dept. SD;Los Banos;CA;U.S.A."}
Dim grid As New PdfGrid()
grid.Style.CellPadding = New PdfPaddings(1, 1, 1, 1)
Dim header As [String]() = data(0).Split(";"C)
grid.Columns.Add(header.Length)
Dim width As Single = page.Canvas.ClientSize.Width - (grid.Columns.Count + 1)
grid.Columns(0).Width = width * 0.25F
grid.Columns(1).Width = width * 0.25F
grid.Columns(2).Width = width * 0.25F
grid.Columns(3).Width = width * 0.15F
grid.Columns(4).Width = width * 0.1F
Dim headerRow As PdfGridRow = grid.Headers.Add(1)(0)
headerRow.Style.Font = New PdfTrueTypeFont(New Font("Arial", 11F, FontStyle.Bold), True)
headerRow.Style.BackgroundBrush = New PdfLinearGradientBrush(New PointF(0, 0), New PointF(x1, 0), Color.Red, Color.Blue)
For i As Integer = 0 To header.Length - 1
headerRow.Cells(i).Value = header(i)
headerRow.Cells(i).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
If i = 0 Then
headerRow.Cells(i).Style.BackgroundBrush = PdfBrushes.Gray
End If
Next
Dim random As New Random()
Dim groupByCountry As New Dictionary(Of [String], Integer)()
For r As Integer = 1 To data.Length - 1
Dim row As PdfGridRow = grid.Rows.Add()
row.Style.Font = New PdfTrueTypeFont(New Font("Arial", 10F), True)
Dim buffer As Byte() = New Byte(5) {}
random.NextBytes(buffer)
Dim color1 As New PdfRGBColor(buffer(0), buffer(1), buffer(2))
Dim color2 As New PdfRGBColor(buffer(3), buffer(4), buffer(5))
row.Style.BackgroundBrush = New PdfLinearGradientBrush(New PointF(0, 0), New PointF(x1, 0), color1, color2)
Dim rowData As [String]() = data(r).Split(";"C)
For c As Integer = 0 To rowData.Length - 1
row.Cells(c).Value = rowData(c)
If c = 0 Then
row.Cells(c).Style.BackgroundBrush = PdfBrushes.Gray
End If
If c < 3 Then
row.Cells(c).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
Else
row.Cells(c).StringFormat = New PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle)
End If
If c = 4 Then
If groupByCountry.ContainsKey(rowData(c)) Then
groupByCountry(rowData(c)) = groupByCountry(rowData(c)) + 1
Else
groupByCountry(rowData(c)) = 1
End If
End If
Next
Next
Dim totalAmount As New StringBuilder()
For Each country As KeyValuePair(Of [String], Integer) In groupByCountry
totalAmount.AppendFormat("{0}:" & vbTab & "{1}", country.Key, country.Value)
totalAmount.AppendLine()
Next
Dim totalAmountRow As PdfGridRow = grid.Rows.Add()
totalAmountRow.Style.BackgroundBrush = PdfBrushes.Plum
totalAmountRow.Cells(0).Value = "Total Amount"
totalAmountRow.Cells(0).Style.Font = New PdfTrueTypeFont(New Font("Arial", 10F, FontStyle.Bold), True)
totalAmountRow.Cells(0).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
totalAmountRow.Cells(1).ColumnSpan = 4
totalAmountRow.Cells(1).Value = totalAmount.ToString()
totalAmountRow.Cells(1).Style.Font = New PdfTrueTypeFont(New Font("Arial", 10F, FontStyle.Bold Or FontStyle.Italic), True)
totalAmountRow.Cells(1).StringFormat = New PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle)
'append product list
Dim productList As New PdfGrid()
productList.Style.Font = New PdfTrueTypeFont(New Font("Arial", 8F), True)
Using conn As New OleDbConnection()
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\..\..\..\..\Data\demo.mdb"
Dim command As New OleDbCommand()
command.CommandText = " select p.Description " & " from vendors v " & " inner join parts p " & " on v.VendorNo = p.VendorNo " & " where v.VendorName = 'Cacor Corporation'"
command.Connection = conn
Using dataAdapter As New OleDbDataAdapter(command)
Dim dataTable As New DataTable()
dataAdapter.Fill(dataTable)
productList.DataSource = dataTable
End Using
End Using
productList.Headers(0).Cells(0).Value = "Cacor Corporation"
productList.Headers(0).Cells(0).Style.Font = New PdfTrueTypeFont(New Font("Arial", 8F, FontStyle.Bold), True)
productList.Headers(0).Cells(0).Style.Borders.All = New PdfPen(New PdfTilingBrush(New SizeF(1, 1)), 0)
grid.Rows(0).Cells(0).Value = productList
grid.Rows(0).Cells(0).StringFormat.Alignment = PdfTextAlignment.Left
Dim result As PdfLayoutResult = grid.Draw(page, New PointF(0, y))
y = y + result.Bounds.Height + 5
Dim brush2 As PdfBrush = PdfBrushes.Gray
Dim font2 As New PdfTrueTypeFont(New Font("Arial", 9F))
result.Page.Canvas.DrawString([String].Format("* All {0} vendors in the list", grid.Rows.Count - 1), font2, brush2, 5, y)
'Save pdf file.
doc.SaveToFile("Grid.pdf")
doc.Close()
'Launching the Pdf file.
PDFDocumentViewer("Grid.pdf")
End Sub
Private Sub PDFDocumentViewer(fileName As String)
Try
System.Diagnostics.Process.Start(fileName)
Catch
End Try
End Sub
End Class
End Namespace