Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
SpireXLS
20 juillet 2011

How to Insert Table with Image by C# in PDF

If a PDF document has displayed some data information, the owner may create a table to make readers learn more clearly about the data.

Firstly, table is designed very simply. The table just contains cells and data information. Then, the creators add some other elements on table, for example, text color, background color and so on. Also, creator may insert small images in cells. Therefore, PDF document owners may insert some beautiful tables.

If we want to insert a table with image in PDF documents, how should we do? Generally speaking, we can use Adobe Acrobat to edit PDF and insert tables. There are many guides which are written by some users. Just follow the guides and then you can get the table.

And I want to introduce one method for developers. This method is used to insert table with image by using C#. The data in this method is about country information.

Note: A component, Spire.PDF is used.

 

Code:

 

Imports System.Data

Imports System.Data.OleDb

Imports System.Drawing

Imports System.IO

Imports Spire.Pdf

Imports Spire.Pdf.Graphics

Imports Spire.Pdf.Tables

 

Namespace ImageTable

    Friend Class Program

        Shared Sub Main(ByVal args() As String)

            '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

 

            '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

 

            '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

 

            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

            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)

 

            AddHandler table.BeginRowLayout, AddressOf table_BeginRowLayout

            AddHandler table.EndCellLayout, AddressOf table_EndCellLayout

 

            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)

 

            'Save pdf file.

            doc.SaveToFile("ImageTable.pdf")

            doc.Close()

 

            'Launching the Pdf file.

            Process.Start("ImageTable.pdf")

        End Sub

 

        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

    End Class

End Namespace

 

Publicité
Publicité
Commentaires
SpireXLS
Publicité
Publicité