Table is one of the best formats to show data information. It can be drawn in many file formats such as word, excel, and PDF documents. In the real life, table can be categorized by simple table, image table, nested table and so on. Of course, these kinds of tables are all can be exported to a PDF table from database. When the table you exported contains images, you need to export both data and pictures into a PDF table. Thus, image table is necessary for you.
This post aims at introducing you how to export data and pictures into PDF table and set the table format with C#, VB.NET. In my method, I use a PDF creation component
Spire.PDF to finish this task in a smooth way. Install Spire.PDF, do not need Adobe Acrobat, you can read, write and manipulate the PDF documents. Please look at the following procedure.
This post aims at introducing you how to export data and pictures into PDF table and set the table format with C#, VB.NET. In my method, I use a PDF creation component
Spire.PDF to finish this task in a smooth way. Install Spire.PDF, do not need Adobe Acrobat, you can read, write and manipulate the PDF documents. Please look at the following procedure.
Procedure
Step1. Create a new project.
1. Create a new project in Visual Studio. Set the Target framework to be .NET Framework 4.
2. Add Sytem.Drawing and Spire.PDF Dll as reference in Project.
3. Add the following using at the top of the method.
C#
using System.Drawing;
using System.IO;
using System.Data;
using System.Data.OleDb;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Tables;
VB.NET
Imports System.Drawing
Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Tables
Step1. Create a new project.
1. Create a new project in Visual Studio. Set the Target framework to be .NET Framework 4.
2. Add Sytem.Drawing and Spire.PDF Dll as reference in Project.
3. Add the following using at the top of the method.
C#
using System.Drawing;
using System.IO;
using System.Data;
using System.Data.OleDb;
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.Tables;
VB.NET
Imports System.Drawing
Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports Spire.Pdf.Tables
Step2. Export data and pictures from database into PDF table and set table format.
1. Create a PDF document and set its margin.C# Code:
//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);
float y = 10;
1. Create a PDF document and set its margin.C# Code:
//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);
float y = 10;
VB.NET Code:
'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)
Dim y As Single = 10
'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)
Dim y As Single = 10
2. Draw table title and set its format.
C# Code:
//title
PdfBrush brush1 = PdfBrushes.Black;
PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial", 16f, FontStyle.Bold));
PdfStringFormat format1 = new PdfStringFormat(PdfTextAlignment.Center);
page.Canvas.DrawString("Country List", font1, brush1, page.Canvas.ClientSize.Width / 2, y, format1);
y = y + font1.MeasureString("Country List", format1).Height;
y = y + 5;
VB.NET Code:
'title
Dim brush1 As PdfBrush = PdfBrushes.Black
Dim font1 As New PdfTrueTypeFont(New Font("Arial", 16.0F, FontStyle.Bold))
Dim format1 As New PdfStringFormat(PdfTextAlignment.Center)
page.Canvas.DrawString("Country List", font1, brush1, page.Canvas.ClientSize.Width \ 2, y, format1)
y = y + font1.MeasureString("Country List", format1).Height
y = y + 5
C# Code:
//title
PdfBrush brush1 = PdfBrushes.Black;
PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial", 16f, FontStyle.Bold));
PdfStringFormat format1 = new PdfStringFormat(PdfTextAlignment.Center);
page.Canvas.DrawString("Country List", font1, brush1, page.Canvas.ClientSize.Width / 2, y, format1);
y = y + font1.MeasureString("Country List", format1).Height;
y = y + 5;
VB.NET Code:
'title
Dim brush1 As PdfBrush = PdfBrushes.Black
Dim font1 As New PdfTrueTypeFont(New Font("Arial", 16.0F, FontStyle.Bold))
Dim format1 As New PdfStringFormat(PdfTextAlignment.Center)
page.Canvas.DrawString("Country List", font1, brush1, page.Canvas.ClientSize.Width \ 2, y, format1)
y = y + font1.MeasureString("Country List", format1).Height
y = y + 5
3. Create data table and set its style.
C# Code:
//create data table
PdfTable table = new PdfTable();
table.Style.CellPadding = 2;
table.Style.BorderPen = new PdfPen(brush1, 0.75f);
table.Style.DefaultStyle.BackgroundBrush = PdfBrushes.SkyBlue;
table.Style.DefaultStyle.Font = new PdfTrueTypeFont(new Font("Arial", 10f));
table.Style.AlternateStyle = new PdfCellStyle();
table.Style.AlternateStyle.BackgroundBrush = PdfBrushes.LightYellow;
table.Style.AlternateStyle.Font = new PdfTrueTypeFont(new Font("Arial", 10f));
table.Style.HeaderSource = PdfHeaderSource.ColumnCaptions;
table.Style.HeaderStyle.BackgroundBrush = PdfBrushes.CadetBlue;
table.Style.HeaderStyle.Font = new PdfTrueTypeFont(new Font("Arial", 11f, FontStyle.Bold));
table.Style.HeaderStyle.StringFormat = new PdfStringFormat(PdfTextAlignment.Center);
table.Style.ShowHeader = true;
VB.NET Code:
'create data table
Dim table As New PdfTable()
table.Style.CellPadding = 2
table.Style.BorderPen = New PdfPen(brush1, 0.75F)
table.Style.DefaultStyle.BackgroundBrush = PdfBrushes.SkyBlue
table.Style.DefaultStyle.Font = New PdfTrueTypeFont(New Font("Arial", 10.0F))
table.Style.AlternateStyle = New PdfCellStyle()
table.Style.AlternateStyle.BackgroundBrush = PdfBrushes.LightYellow
table.Style.AlternateStyle.Font = New PdfTrueTypeFont(New Font("Arial", 10.0F))
table.Style.HeaderSource = PdfHeaderSource.ColumnCaptions
table.Style.HeaderStyle.BackgroundBrush = PdfBrushes.CadetBlue
table.Style.HeaderStyle.Font = New PdfTrueTypeFont(New Font("Arial", 11.0F, FontStyle.Bold))
table.Style.HeaderStyle.StringFormat = New PdfStringFormat(PdfTextAlignment.Center)
table.Style.ShowHeader = True
4. Connect database and export data table in to PDF table.
C# Code
using (OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=demo.mdb";
OleDbCommand command = new OleDbCommand();
command.CommandText
= " select Name, '' as Flag, Capital, Continent, Area, Population, Flag as FlagData from country ";
command.Connection = conn;
using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command))
{
DataTable dataTable = new DataTable();
dataAdapter.Fill(dataTable);
dataTable.Columns.Add(new DataColumn("FlagImage", typeof(PdfImage)));
table.DataSourceType = PdfTableDataSourceType.TableDirect;
table.DataSource = dataTable;
}
}
VB.NET Code:
Using conn As New OleDbConnection()
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=demo.mdb"
Dim command As New OleDbCommand()
command.CommandText _
= " select Name, '' as Flag, Capital, Continent, Area, Population, Flag as FlagData from country "
command.Connection = conn
Using dataAdapter As New OleDbDataAdapter(command)
Dim dataTable As New DataTable()
dataAdapter.Fill(dataTable)
dataTable.Columns.Add(New DataColumn("FlagImage", GetType(PdfImage)))
table.DataSourceType = PdfTableDataSourceType.TableDirect
table.DataSource = dataTable
End Using
End Using
5. Set PDF table format and layout including column format, row and cell layout, table color, text font and so on.
C# Code:
float width
= page.Canvas.ClientSize.Width
- (table.Columns.Count + 1) * table.Style.BorderPen.Width;
table.Columns[0].Width = width * 0.21f;
table.Columns[0].StringFormat
= new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
table.Columns[1].Width = width * 0.10f;
table.Columns[1].StringFormat
= new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
table.Columns[2].Width = width * 0.19f;
table.Columns[2].StringFormat
= new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
table.Columns[3].Width = width * 0.21f;
table.Columns[3].StringFormat
= new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
table.Columns[4].Width = width * 0.12f;
table.Columns[4].StringFormat
= new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle);
table.Columns[5].Width = width * 0.17f;
table.Columns[5].StringFormat
= new PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle);
PdfTableLayoutFormat tableLayout = new PdfTableLayoutFormat();
tableLayout.Break = PdfLayoutBreakType.FitElement;
tableLayout.Layout = PdfLayoutType.Paginate;
tableLayout.EndColumnIndex = table.Columns.Count - 2 - 1;
PdfLayoutResult result = table.Draw(page, new PointF(0, y), tableLayout);
y = y + result.Bounds.Height + 5;
PdfBrush brush2 = PdfBrushes.Gray;
PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial", 9f));
page.Canvas.DrawString(String.Format("* {0} countries in the list.", table.Rows.Count),
font2, brush2, 5, y);
table.EndCellLayout += new EndCellLayoutEventHandler(table_EndCellLayout);
table.BeginRowLayout += new BeginRowLayoutEventHandler(table_BeginRowLayout);
static void table_EndCellLayout(object sender, EndCellLayoutEventArgs args)
{
if (args.RowIndex < 0)
{
//header
return;
}
if (args.CellIndex == 1)
{
DataTable dataTable = (sender as PdfTable).DataSource as DataTable;
PdfImage image = dataTable.Rows[args.RowIndex][7] as PdfImage;
float x = (args.Bounds.Width - image.PhysicalDimension.Width) / 2 + args.Bounds.X;
float y = (args.Bounds.Height - image.PhysicalDimension.Height) / 2 + args.Bounds.Y;
args.Graphics.DrawImage(image, x, y);
}
}
static void table_BeginRowLayout(object sender, BeginRowLayoutEventArgs args)
{
if (args.RowIndex < 0)
{
//header
return;
}
DataTable dataTable = (sender as PdfTable).DataSource as DataTable;
byte[] imageData = dataTable.Rows[args.RowIndex][6] as byte[];
using (MemoryStream stream = new MemoryStream(imageData))
{
PdfImage image = PdfImage.FromStream(stream);
args.MinimalHeight = 4 + image.PhysicalDimension.Height;
dataTable.Rows[args.RowIndex][7] = image;
}
}
VB.NET Code:
Dim width As Single = page.Canvas.ClientSize.Width - (table.Columns.Count + 1) * table.Style.BorderPen.Width
table.Columns(0).Width = width * 0.21F
table.Columns(0).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
table.Columns(1).Width = width * 0.1F
table.Columns(1).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
table.Columns(2).Width = width * 0.19F
table.Columns(2).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
table.Columns(3).Width = width * 0.21F
table.Columns(3).StringFormat = New PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle)
table.Columns(4).Width = width * 0.12F
table.Columns(4).StringFormat = New PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle)
table.Columns(5).Width = width * 0.17F
table.Columns(5).StringFormat = New PdfStringFormat(PdfTextAlignment.Right, PdfVerticalAlignment.Middle)
Dim tableLayout As New PdfTableLayoutFormat()
tableLayout.Break = PdfLayoutBreakType.FitElement
tableLayout.Layout = PdfLayoutType.Paginate
tableLayout.EndColumnIndex = table.Columns.Count - 2 - 1
Dim result As PdfLayoutResult = table.Draw(page, New PointF(0, y), tableLayout)
y = y + result.Bounds.Height + 5
Dim brush2 As PdfBrush = PdfBrushes.Gray
Dim font2 As New PdfTrueTypeFont(New Font("Arial", 9.0F))
page.Canvas.DrawString(String.Format("* {0} countries in the list.", table.Rows.Count), font2, brush2, 5, y)
AddHandler table.EndCellLayout, AddressOf table_EndCellLayout
AddHandler table.BeginRowLayout, AddressOf table_BeginRowLayout
Private Shared Sub table_EndCellLayout(ByVal sender As Object, ByVal args As EndCellLayoutEventArgs)
If args.RowIndex < 0 Then
'header
Return
End If
If args.CellIndex = 1 Then
Dim dataTable As DataTable = TryCast((TryCast(sender, PdfTable)).DataSource, DataTable)
Dim image As PdfImage = TryCast(dataTable.Rows(args.RowIndex)(7), PdfImage)
Dim x As Single = (args.Bounds.Width - image.PhysicalDimension.Width) / 2 + args.Bounds.X
Dim y As Single = (args.Bounds.Height - image.PhysicalDimension.Height) / 2 + args.Bounds.Y
args.Graphics.DrawImage(image, x, y)
End If
End Sub
Private Shared Sub table_BeginRowLayout(ByVal sender As Object, ByVal args As BeginRowLayoutEventArgs)
If args.RowIndex < 0 Then
'header
Return
End If
Dim dataTable As DataTable = TryCast((TryCast(sender, PdfTable)).DataSource, DataTable)
Dim imageData() As Byte = TryCast(dataTable.Rows(args.RowIndex)(6), Byte())
Using stream As New MemoryStream(imageData)
Dim image As PdfImage = PdfImage.FromStream(stream)
args.MinimalHeight = 4 + image.PhysicalDimension.Height
dataTable.Rows(args.RowIndex)(7) = image
End Using
End Sub
Step3. Save and launch the file.
C# Code:
//Save pdf file.
doc.SaveToFile("ImageTable.pdf");
doc.Close();
//Launching the Pdf file.
System.Diagnostics.Process.Start("ImageTable.pdf");
VB.NET Code:
'Save pdf file.
doc.SaveToFile("ImageTable.pdf")
doc.Close()
'Launching the Pdf file.
Process.Start("ImageTable.pdf")
Note: The “demo.mdb” is a database loaded from downloaded Spire.PDF.
Preview
Spire.PDF supports .NET/Silverlight applications. And can be used on the sever side ( ASP .NET or any other environment) or with Windows Forms applications.
More PDF Functions