Table of Contents

Custom previewing (VB.Net / netframework)

Note

This demo is available in your FlexCel installation at <FlexCel Install Folder>\samples\vb\VS2022\netframework\25.Printing and Exporting\20.CustomPreview and also at https:​//​github.​com/​tmssoftware/​TMS-​FlexCel.​NET-​demos/​tree/​master/​vb/​VS2022/​netframework/​Modules/​25.​Printing and Exporting/​20.​Custom​Preview

Overview

FlexCel comes with a full featured viewer that you can use to display a preview of Excel files in your application, and without having any printer installed.

Concepts

  • How to create a preview form that you can embed inside your application, including thumbnails, navigation, etc.

  • How to Export to PDF from a thread, allowing the user to cancel it.

Files

AssemblyInfo.vb

Imports System.Reflection
Imports System.Runtime.CompilerServices

'
' General Information about an assembly is controlled through the following 
' set of attributes. Change these attribute values to modify the information
' associated with an assembly.
'
<Assembly: AssemblyTitle("Custom Preview")>
<Assembly: AssemblyDescription("A custom previewer of xls files using FlexCel engine.")>
<Assembly: AssemblyConfiguration("")>
<Assembly: AssemblyCompany("TMS Software")>
<Assembly: AssemblyProduct("")>
<Assembly: AssemblyCopyright("(c) 2002 - 2014 TMS Software")>
<Assembly: AssemblyTrademark("")>
<Assembly: AssemblyCulture("")>

'
' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' You can specify all the values or you can default the Revision and Build Numbers 
' by using the '*' as shown below:

<Assembly: AssemblyVersion("6.2.1.0")>

'
' In order to sign your assembly you must specify a key to use. Refer to the 
' Microsoft .NET Framework documentation for more information on assembly signing.
'
' Use the attributes below to control which key is used for signing. 
'
' Notes: 
'   (*) If no key is specified, the assembly is not signed.
'   (*) KeyName refers to a key that has been installed in the Crypto Service
'       Provider (CSP) on your machine. KeyFile refers to a file which contains
'       a key.
'   (*) If the KeyFile and the KeyName values are both specified, the 
'       following processing occurs:
'       (1) If the KeyName can be found in the CSP, that key is used.
'       (2) If the KeyName does not exist and the KeyFile does exist, the key 
'           in the KeyFile is installed into the CSP and used.
'   (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
'       When specifying the KeyFile, the location of the KeyFile should be
'       relative to the project output directory which is
'       %Project Directory%\obj\<configuration>. For example, if your KeyFile is
'       located in the project directory, you would specify the AssemblyKeyFile 
'       attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
'   (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
'       documentation for more information on this.
'
<Assembly: AssemblyDelaySign(False)>
<Assembly: AssemblyKeyFile("")>
<Assembly: AssemblyKeyName("")>

Form1.Designer.vb

Imports System.ComponentModel
Imports System.IO
Imports System.Drawing.Drawing2D
Imports System.Threading
Imports FlexCel.Core
Imports FlexCel.XlsAdapter
Imports FlexCel.Winforms
Imports FlexCel.Render
Imports FlexCel.Pdf
Namespace CustomPreview
	Partial Public Class mainForm
		Inherits System.Windows.Forms.Form

		''' <summary>
		''' Required designer variable.
		''' </summary>
		Private components As System.ComponentModel.IContainer = Nothing

		''' <summary>
		''' Clean up any resources being used.
		''' </summary>
		Protected Overrides Sub Dispose(ByVal disposing As Boolean)
			If disposing Then
				If components IsNot Nothing Then
					components.Dispose()
				End If
			End If
			MyBase.Dispose(disposing)
		End Sub

		#Region "Windows Form Designer generated code"
		''' <summary>
		''' Required method for Designer support - do not modify
		''' the contents of this method with the code editor.
		''' </summary>
		Private Sub InitializeComponent()
			Me.components = New System.ComponentModel.Container()
			Dim resources As New System.ComponentModel.ComponentResourceManager(GetType(mainForm))
			Me.flexCelImgExport1 = New FlexCel.Render.FlexCelImgExport()
			Me.openFileDialog = New System.Windows.Forms.OpenFileDialog()
			Me.panel1 = New System.Windows.Forms.Panel()
			Me.MainPreview = New FlexCel.Winforms.FlexCelPreview()
			Me.thumbs = New FlexCel.Winforms.FlexCelPreview()
			Me.splitter1 = New System.Windows.Forms.Splitter()
			Me.panelLeft = New System.Windows.Forms.Panel()
			Me.cbAllSheets = New System.Windows.Forms.CheckBox()
			Me.label2 = New System.Windows.Forms.Label()
			Me.sheetSplitter = New System.Windows.Forms.Splitter()
			Me.lbSheets = New System.Windows.Forms.ListBox()
			Me.label1 = New System.Windows.Forms.Label()
			Me.PdfSaveFileDialog = New System.Windows.Forms.SaveFileDialog()
			Me.toolTip1 = New System.Windows.Forms.ToolTip(Me.components)
			Me.mainToolbar = New System.Windows.Forms.ToolStrip()
			Me.openFile = New System.Windows.Forms.ToolStripButton()
			Me.toolStripSeparator2 = New System.Windows.Forms.ToolStripSeparator()
			Me.btnFirst = New System.Windows.Forms.ToolStripButton()
			Me.btnPrev = New System.Windows.Forms.ToolStripButton()
			Me.edPage = New System.Windows.Forms.ToolStripTextBox()
			Me.btnNext = New System.Windows.Forms.ToolStripButton()
			Me.btnLast = New System.Windows.Forms.ToolStripButton()
			Me.toolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator()
			Me.btnAutofit = New System.Windows.Forms.ToolStripDropDownButton()
			Me.noneToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
			Me.fitToWidthToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
			Me.fitToHeightToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
			Me.fitToPageToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
			Me.btnZoomOut = New System.Windows.Forms.ToolStripButton()
			Me.edZoom = New System.Windows.Forms.ToolStripTextBox()
			Me.btnZoomIn = New System.Windows.Forms.ToolStripButton()
			Me.toolStripSeparator3 = New System.Windows.Forms.ToolStripSeparator()
			Me.btnGridLines = New System.Windows.Forms.ToolStripButton()
			Me.btnHeadings = New System.Windows.Forms.ToolStripButton()
			Me.toolStripSeparator4 = New System.Windows.Forms.ToolStripSeparator()
			Me.btnRecalc = New System.Windows.Forms.ToolStripButton()
			Me.btnPdf = New System.Windows.Forms.ToolStripButton()
			Me.btnClose = New System.Windows.Forms.ToolStripButton()
			Me.panel1.SuspendLayout()
			Me.panelLeft.SuspendLayout()
			Me.mainToolbar.SuspendLayout()
			Me.SuspendLayout()
			' 
			' flexCelImgExport1
			' 
			Me.flexCelImgExport1.AllVisibleSheets = False
			Me.flexCelImgExport1.PageSize = Nothing
			Me.flexCelImgExport1.ResetPageNumberOnEachSheet = False
			Me.flexCelImgExport1.Resolution = 96R
			Me.flexCelImgExport1.Workbook = Nothing
			' 
			' openFileDialog
			' 
			Me.openFileDialog.DefaultExt = "xls"
			Me.openFileDialog.Filter = "Excel Files|*.xls|All files|*.*"
			Me.openFileDialog.Title = "Select a file to preview"
			' 
			' panel1
			' 
			Me.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
			Me.panel1.Controls.Add(Me.MainPreview)
			Me.panel1.Controls.Add(Me.splitter1)
			Me.panel1.Controls.Add(Me.panelLeft)
			Me.panel1.Dock = System.Windows.Forms.DockStyle.Fill
			Me.panel1.Location = New System.Drawing.Point(0, 46)
			Me.panel1.Name = "panel1"
			Me.panel1.Size = New System.Drawing.Size(808, 375)
			Me.panel1.TabIndex = 8
			' 
			' MainPreview
			' 
			Me.MainPreview.AutoScrollMinSize = New System.Drawing.Size(40, 383)
			Me.MainPreview.Dock = System.Windows.Forms.DockStyle.Fill
			Me.MainPreview.Document = Me.flexCelImgExport1
			Me.MainPreview.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
			Me.MainPreview.Location = New System.Drawing.Point(144, 0)
			Me.MainPreview.Name = "MainPreview"
			Me.MainPreview.PageXSeparation = 20
			Me.MainPreview.Size = New System.Drawing.Size(662, 373)
			Me.MainPreview.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
			Me.MainPreview.StartPage = 1
			Me.MainPreview.TabIndex = 2
			Me.MainPreview.ThumbnailLarge = Nothing
			Me.MainPreview.ThumbnailSmall = Me.thumbs
'			Me.MainPreview.StartPageChanged += New System.EventHandler(Me.flexCelPreview1_StartPageChanged)
'			Me.MainPreview.ZoomChanged += New System.EventHandler(Me.flexCelPreview1_ZoomChanged)
			' 
			' thumbs
			' 
			Me.thumbs.AutoScrollMinSize = New System.Drawing.Size(20, 10)
			Me.thumbs.Dock = System.Windows.Forms.DockStyle.Fill
			Me.thumbs.Document = Me.flexCelImgExport1
			Me.thumbs.Location = New System.Drawing.Point(0, 115)
			Me.thumbs.Name = "thumbs"
			Me.thumbs.Size = New System.Drawing.Size(136, 258)
			Me.thumbs.StartPage = 1
			Me.thumbs.TabIndex = 3
			Me.thumbs.ThumbnailLarge = Me.MainPreview
			Me.thumbs.ThumbnailSmall = Nothing
			Me.thumbs.Zoom = 0.1R
			' 
			' splitter1
			' 
			Me.splitter1.BackColor = System.Drawing.SystemColors.ControlLightLight
			Me.splitter1.Location = New System.Drawing.Point(136, 0)
			Me.splitter1.MinSize = 0
			Me.splitter1.Name = "splitter1"
			Me.splitter1.Size = New System.Drawing.Size(8, 373)
			Me.splitter1.TabIndex = 11
			Me.splitter1.TabStop = False
			' 
			' panelLeft
			' 
			Me.panelLeft.Controls.Add(Me.cbAllSheets)
			Me.panelLeft.Controls.Add(Me.thumbs)
			Me.panelLeft.Controls.Add(Me.label2)
			Me.panelLeft.Controls.Add(Me.sheetSplitter)
			Me.panelLeft.Controls.Add(Me.lbSheets)
			Me.panelLeft.Controls.Add(Me.label1)
			Me.panelLeft.Dock = System.Windows.Forms.DockStyle.Left
			Me.panelLeft.Location = New System.Drawing.Point(0, 0)
			Me.panelLeft.Name = "panelLeft"
			Me.panelLeft.Size = New System.Drawing.Size(136, 373)
			Me.panelLeft.TabIndex = 9
			' 
			' cbAllSheets
			' 
			Me.cbAllSheets.Location = New System.Drawing.Point(16, 16)
			Me.cbAllSheets.Name = "cbAllSheets"
			Me.cbAllSheets.Size = New System.Drawing.Size(104, 16)
			Me.cbAllSheets.TabIndex = 14
			Me.cbAllSheets.Text = "All Sheets"
'			Me.cbAllSheets.CheckedChanged += New System.EventHandler(Me.cbAllSheets_CheckedChanged)
			' 
			' label2
			' 
			Me.label2.Dock = System.Windows.Forms.DockStyle.Top
			Me.label2.Location = New System.Drawing.Point(0, 99)
			Me.label2.Name = "label2"
			Me.label2.Size = New System.Drawing.Size(136, 16)
			Me.label2.TabIndex = 13
			Me.label2.Text = "Thumbs"
			' 
			' sheetSplitter
			' 
			Me.sheetSplitter.BackColor = System.Drawing.SystemColors.ControlLightLight
			Me.sheetSplitter.Dock = System.Windows.Forms.DockStyle.Top
			Me.sheetSplitter.Location = New System.Drawing.Point(0, 91)
			Me.sheetSplitter.Name = "sheetSplitter"
			Me.sheetSplitter.Size = New System.Drawing.Size(136, 8)
			Me.sheetSplitter.TabIndex = 11
			Me.sheetSplitter.TabStop = False
			' 
			' lbSheets
			' 
			Me.lbSheets.Dock = System.Windows.Forms.DockStyle.Top
			Me.lbSheets.Items.AddRange(New Object() { "No open file"})
			Me.lbSheets.Location = New System.Drawing.Point(0, 35)
			Me.lbSheets.Name = "lbSheets"
			Me.lbSheets.Size = New System.Drawing.Size(136, 56)
			Me.lbSheets.TabIndex = 10
'			Me.lbSheets.SelectedIndexChanged += New System.EventHandler(Me.lbSheets_SelectedIndexChanged)
			' 
			' label1
			' 
			Me.label1.Dock = System.Windows.Forms.DockStyle.Top
			Me.label1.Location = New System.Drawing.Point(0, 0)
			Me.label1.Name = "label1"
			Me.label1.Size = New System.Drawing.Size(136, 35)
			Me.label1.TabIndex = 12
			Me.label1.Text = "Sheets"
			' 
			' PdfSaveFileDialog
			' 
			Me.PdfSaveFileDialog.DefaultExt = "pdf"
			Me.PdfSaveFileDialog.Filter = "Pdf Files|*.pdf"
			Me.PdfSaveFileDialog.Title = "Select the file to export to:"
			' 
			' mainToolbar
			' 
			Me.mainToolbar.ImageScalingSize = New System.Drawing.Size(24, 24)
			Me.mainToolbar.Items.AddRange(New System.Windows.Forms.ToolStripItem() { Me.openFile, Me.toolStripSeparator2, Me.btnFirst, Me.btnPrev, Me.edPage, Me.btnNext, Me.btnLast, Me.toolStripSeparator1, Me.btnAutofit, Me.btnZoomOut, Me.edZoom, Me.btnZoomIn, Me.toolStripSeparator3, Me.btnGridLines, Me.btnHeadings, Me.toolStripSeparator4, Me.btnRecalc, Me.btnPdf, Me.btnClose})
			Me.mainToolbar.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow
			Me.mainToolbar.Location = New System.Drawing.Point(0, 0)
			Me.mainToolbar.Name = "mainToolbar"
			Me.mainToolbar.Size = New System.Drawing.Size(808, 46)
			Me.mainToolbar.TabIndex = 14
			' 
			' openFile
			' 
			Me.openFile.Image = My.Resources.open
			Me.openFile.ImageAlign = System.Drawing.ContentAlignment.TopCenter
			Me.openFile.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.openFile.Name = "openFile"
			Me.openFile.Size = New System.Drawing.Size(61, 43)
			Me.openFile.Text = "&Open File"
			Me.openFile.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			Me.openFile.ToolTipText = "Open an Excel file"
'			Me.openFile.Click += New System.EventHandler(Me.openFile_Click)
			' 
			' toolStripSeparator2
			' 
			Me.toolStripSeparator2.AutoSize = False
			Me.toolStripSeparator2.Name = "toolStripSeparator2"
			Me.toolStripSeparator2.Size = New System.Drawing.Size(20, 46)
			' 
			' btnFirst
			' 
			Me.btnFirst.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
			Me.btnFirst.Enabled = False
			Me.btnFirst.Image = (CType(resources.GetObject("btnFirst.Image"), System.Drawing.Image))
			Me.btnFirst.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnFirst.Name = "btnFirst"
			Me.btnFirst.Size = New System.Drawing.Size(27, 43)
			Me.btnFirst.Text = "<<"
			Me.btnFirst.ToolTipText = "First page"
'			Me.btnFirst.Click += New System.EventHandler(Me.btnFirst_Click)
			' 
			' btnPrev
			' 
			Me.btnPrev.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
			Me.btnPrev.Enabled = False
			Me.btnPrev.Image = (CType(resources.GetObject("btnPrev.Image"), System.Drawing.Image))
			Me.btnPrev.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnPrev.Name = "btnPrev"
			Me.btnPrev.Size = New System.Drawing.Size(23, 43)
			Me.btnPrev.Text = "<"
			Me.btnPrev.ToolTipText = "Previous page"
'			Me.btnPrev.Click += New System.EventHandler(Me.btnPrev_Click)
			' 
			' edPage
			' 
			Me.edPage.AutoSize = False
			Me.edPage.Enabled = False
			Me.edPage.Name = "edPage"
			Me.edPage.Size = New System.Drawing.Size(100, 18)
			Me.edPage.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Right
'			Me.edPage.Leave += New System.EventHandler(Me.edPage_Leave)
'			Me.edPage.KeyPress += New System.Windows.Forms.KeyPressEventHandler(Me.edPage_KeyPress)
			' 
			' btnNext
			' 
			Me.btnNext.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
			Me.btnNext.Enabled = False
			Me.btnNext.Image = (CType(resources.GetObject("btnNext.Image"), System.Drawing.Image))
			Me.btnNext.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnNext.Name = "btnNext"
			Me.btnNext.Size = New System.Drawing.Size(23, 43)
			Me.btnNext.Text = ">"
			Me.btnNext.ToolTipText = "Next page"
'			Me.btnNext.Click += New System.EventHandler(Me.btnNext_Click)
			' 
			' btnLast
			' 
			Me.btnLast.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
			Me.btnLast.Enabled = False
			Me.btnLast.Image = (CType(resources.GetObject("btnLast.Image"), System.Drawing.Image))
			Me.btnLast.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnLast.Name = "btnLast"
			Me.btnLast.Size = New System.Drawing.Size(27, 43)
			Me.btnLast.Text = ">>"
			Me.btnLast.ToolTipText = "Last page"
'			Me.btnLast.Click += New System.EventHandler(Me.btnLast_Click)
			' 
			' toolStripSeparator1
			' 
			Me.toolStripSeparator1.Name = "toolStripSeparator1"
			Me.toolStripSeparator1.Size = New System.Drawing.Size(6, 46)
			' 
			' btnAutofit
			' 
			Me.btnAutofit.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() { Me.noneToolStripMenuItem, Me.fitToWidthToolStripMenuItem, Me.fitToHeightToolStripMenuItem, Me.fitToPageToolStripMenuItem})
			Me.btnAutofit.Image = My.Resources.autofit
			Me.btnAutofit.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnAutofit.Name = "btnAutofit"
			Me.btnAutofit.Size = New System.Drawing.Size(76, 43)
			Me.btnAutofit.Text = "No Autofit"
			Me.btnAutofit.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			' 
			' noneToolStripMenuItem
			' 
			Me.noneToolStripMenuItem.Name = "noneToolStripMenuItem"
			Me.noneToolStripMenuItem.Size = New System.Drawing.Size(140, 22)
			Me.noneToolStripMenuItem.Text = "No Autofit"
'			Me.noneToolStripMenuItem.Click += New System.EventHandler(Me.noneToolStripMenuItem_Click)
			' 
			' fitToWidthToolStripMenuItem
			' 
			Me.fitToWidthToolStripMenuItem.Name = "fitToWidthToolStripMenuItem"
			Me.fitToWidthToolStripMenuItem.Size = New System.Drawing.Size(140, 22)
			Me.fitToWidthToolStripMenuItem.Text = "Fit to Width"
'			Me.fitToWidthToolStripMenuItem.Click += New System.EventHandler(Me.fitToWidthToolStripMenuItem_Click)
			' 
			' fitToHeightToolStripMenuItem
			' 
			Me.fitToHeightToolStripMenuItem.Name = "fitToHeightToolStripMenuItem"
			Me.fitToHeightToolStripMenuItem.Size = New System.Drawing.Size(140, 22)
			Me.fitToHeightToolStripMenuItem.Text = "Fit to Height"
'			Me.fitToHeightToolStripMenuItem.Click += New System.EventHandler(Me.fitToHeightToolStripMenuItem_Click)
			' 
			' fitToPageToolStripMenuItem
			' 
			Me.fitToPageToolStripMenuItem.Name = "fitToPageToolStripMenuItem"
			Me.fitToPageToolStripMenuItem.Size = New System.Drawing.Size(140, 22)
			Me.fitToPageToolStripMenuItem.Text = "Fit to Page"
'			Me.fitToPageToolStripMenuItem.Click += New System.EventHandler(Me.fitToPageToolStripMenuItem_Click)
			' 
			' btnZoomOut
			' 
			Me.btnZoomOut.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
			Me.btnZoomOut.Enabled = False
			Me.btnZoomOut.Image = (CType(resources.GetObject("btnZoomOut.Image"), System.Drawing.Image))
			Me.btnZoomOut.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnZoomOut.Name = "btnZoomOut"
			Me.btnZoomOut.Size = New System.Drawing.Size(23, 43)
			Me.btnZoomOut.Text = "-"
			Me.btnZoomOut.ToolTipText = "Zoom out"
'			Me.btnZoomOut.Click += New System.EventHandler(Me.btnZoomOut_Click)
			' 
			' edZoom
			' 
			Me.edZoom.AutoSize = False
			Me.edZoom.Enabled = False
			Me.edZoom.Name = "edZoom"
			Me.edZoom.Size = New System.Drawing.Size(40, 18)
			Me.edZoom.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Right
'			Me.edZoom.Enter += New System.EventHandler(Me.edZoom_Enter)
'			Me.edZoom.KeyPress += New System.Windows.Forms.KeyPressEventHandler(Me.edZoom_KeyPress)
			' 
			' btnZoomIn
			' 
			Me.btnZoomIn.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
			Me.btnZoomIn.Enabled = False
			Me.btnZoomIn.Image = (CType(resources.GetObject("btnZoomIn.Image"), System.Drawing.Image))
			Me.btnZoomIn.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnZoomIn.Name = "btnZoomIn"
			Me.btnZoomIn.Size = New System.Drawing.Size(23, 43)
			Me.btnZoomIn.Text = "+"
			Me.btnZoomIn.ToolTipText = "Zoom in"
'			Me.btnZoomIn.Click += New System.EventHandler(Me.btnZoomIn_Click)
			' 
			' toolStripSeparator3
			' 
			Me.toolStripSeparator3.AutoSize = False
			Me.toolStripSeparator3.Name = "toolStripSeparator3"
			Me.toolStripSeparator3.Size = New System.Drawing.Size(20, 46)
			' 
			' btnGridLines
			' 
			Me.btnGridLines.CheckOnClick = True
			Me.btnGridLines.Enabled = False
			Me.btnGridLines.Image = My.Resources.grid
			Me.btnGridLines.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnGridLines.Name = "btnGridLines"
			Me.btnGridLines.Size = New System.Drawing.Size(57, 43)
			Me.btnGridLines.Text = "&Gridlines"
			Me.btnGridLines.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			Me.btnGridLines.ToolTipText = "Show gridlines"
'			Me.btnGridLines.Click += New System.EventHandler(Me.btnGridLines_Click)
			' 
			' btnHeadings
			' 
			Me.btnHeadings.CheckOnClick = True
			Me.btnHeadings.Enabled = False
			Me.btnHeadings.Image = My.Resources.Head
			Me.btnHeadings.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnHeadings.Name = "btnHeadings"
			Me.btnHeadings.Size = New System.Drawing.Size(61, 43)
			Me.btnHeadings.Text = "&Headings"
			Me.btnHeadings.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			Me.btnHeadings.ToolTipText = "Show the headings"
'			Me.btnHeadings.Click += New System.EventHandler(Me.btnHeadings_Click)
			' 
			' toolStripSeparator4
			' 
			Me.toolStripSeparator4.Name = "toolStripSeparator4"
			Me.toolStripSeparator4.Size = New System.Drawing.Size(6, 46)
			' 
			' btnRecalc
			' 
			Me.btnRecalc.Enabled = False
			Me.btnRecalc.Image = My.Resources.calc
			Me.btnRecalc.ImageAlign = System.Drawing.ContentAlignment.TopCenter
			Me.btnRecalc.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnRecalc.Name = "btnRecalc"
			Me.btnRecalc.Size = New System.Drawing.Size(45, 43)
			Me.btnRecalc.Text = "&Recalc"
			Me.btnRecalc.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			Me.btnRecalc.ToolTipText = "Recalculate the file"
'			Me.btnRecalc.Click += New System.EventHandler(Me.btnRecalc_Click)
			' 
			' btnPdf
			' 
			Me.btnPdf.Enabled = False
			Me.btnPdf.Image = My.Resources.pdf
			Me.btnPdf.ImageAlign = System.Drawing.ContentAlignment.TopCenter
			Me.btnPdf.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnPdf.Name = "btnPdf"
			Me.btnPdf.Size = New System.Drawing.Size(79, 43)
			Me.btnPdf.Text = "Export to &Pdf"
			Me.btnPdf.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			Me.btnPdf.ToolTipText = "Export the file to Pdf"
'			Me.btnPdf.Click += New System.EventHandler(Me.btnPdf_Click)
			' 
			' btnClose
			' 
			Me.btnClose.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
			Me.btnClose.Image = My.Resources.close
			Me.btnClose.ImageAlign = System.Drawing.ContentAlignment.TopCenter
			Me.btnClose.ImageTransparentColor = System.Drawing.Color.Magenta
			Me.btnClose.Name = "btnClose"
			Me.btnClose.Size = New System.Drawing.Size(59, 43)
			Me.btnClose.Text = "     E&xit     "
			Me.btnClose.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText
			Me.btnClose.ToolTipText = "Exit from the application"
'			Me.btnClose.Click += New System.EventHandler(Me.btnClose_Click)
			' 
			' mainForm
			' 
			Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
			Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
			Me.ClientSize = New System.Drawing.Size(808, 421)
			Me.Controls.Add(Me.panel1)
			Me.Controls.Add(Me.mainToolbar)
			Me.Name = "mainForm"
			Me.Text = "Custom Preview Demo"
'			Me.Load += New System.EventHandler(Me.mainForm_Load)
			Me.panel1.ResumeLayout(False)
			Me.panelLeft.ResumeLayout(False)
			Me.mainToolbar.ResumeLayout(False)
			Me.mainToolbar.PerformLayout()
			Me.ResumeLayout(False)
			Me.PerformLayout()

		End Sub
		#End Region

		Private openFileDialog As System.Windows.Forms.OpenFileDialog
		Private panel1 As System.Windows.Forms.Panel
		Private panelLeft As System.Windows.Forms.Panel
		Private WithEvents lbSheets As System.Windows.Forms.ListBox
		Private splitter1 As System.Windows.Forms.Splitter
		Private label1 As System.Windows.Forms.Label
		Private label2 As System.Windows.Forms.Label
		Private PdfSaveFileDialog As System.Windows.Forms.SaveFileDialog
		Private WithEvents cbAllSheets As System.Windows.Forms.CheckBox
		Private sheetSplitter As System.Windows.Forms.Splitter
		Private toolTip1 As System.Windows.Forms.ToolTip
		Private flexCelImgExport1 As FlexCel.Render.FlexCelImgExport
		Private WithEvents MainPreview As FlexCel.Winforms.FlexCelPreview
		Private thumbs As FlexCel.Winforms.FlexCelPreview
		Private mainToolbar As ToolStrip
		Private WithEvents openFile As ToolStripButton
		Private toolStripSeparator1 As ToolStripSeparator
		Private WithEvents btnRecalc As ToolStripButton
		Private WithEvents btnPdf As ToolStripButton
		Private WithEvents btnClose As ToolStripButton
		Private toolStripSeparator2 As ToolStripSeparator
		Private WithEvents btnFirst As ToolStripButton
		Private WithEvents btnPrev As ToolStripButton
		Private WithEvents edPage As ToolStripTextBox
		Private WithEvents btnNext As ToolStripButton
		Private WithEvents btnLast As ToolStripButton
		Private WithEvents btnZoomOut As ToolStripButton
		Private WithEvents edZoom As ToolStripTextBox
		Private WithEvents btnZoomIn As ToolStripButton
		Private toolStripSeparator3 As ToolStripSeparator
		Private WithEvents btnHeadings As ToolStripButton
		Private WithEvents btnGridLines As ToolStripButton
		Private toolStripSeparator4 As ToolStripSeparator
		Private btnAutofit As ToolStripDropDownButton
		Private WithEvents noneToolStripMenuItem As ToolStripMenuItem
		Private WithEvents fitToWidthToolStripMenuItem As ToolStripMenuItem
		Private WithEvents fitToHeightToolStripMenuItem As ToolStripMenuItem
		Private WithEvents fitToPageToolStripMenuItem As ToolStripMenuItem
	End Class
End Namespace


Form1.vb

Imports System.ComponentModel
Imports System.IO
Imports System.Drawing.Drawing2D

Imports System.Threading

Imports FlexCel.Core
Imports FlexCel.XlsAdapter
Imports FlexCel.Winforms
Imports FlexCel.Render
Imports FlexCel.Pdf

Namespace CustomPreview
	''' <summary>
	''' Previewer of files.
	''' </summary>
	Partial Public Class mainForm
		Inherits System.Windows.Forms.Form

		Public Sub New()
			Me.New(New String(){})
		End Sub

		Public Sub New(ByVal Args() As String)
			InitializeComponent()
			ResizeToolbar(mainToolbar)
			If Args.Length > 0 Then
				LoadFile(Args(0))
			End If

			If ExcelFile.SupportsXlsx Then
				Me.openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm|Excel 97/2003|*.xls|Excel 2007|*.xlsx;*.xlsm|All files|*.*"
			End If

			MainPreview.CenteredPreview = True
			thumbs.CenteredPreview = True
		End Sub

		Private Sub ResizeToolbar(ByVal toolbar As ToolStrip)

			Using gr As Graphics = CreateGraphics()
				Dim xFactor As Double = gr.DpiX / 96.0
				Dim yFactor As Double = gr.DpiY / 96.0
				toolbar.ImageScalingSize = New Size(CInt(Fix(24 * xFactor)), CInt(Fix(24 * yFactor)))
				toolbar.Width = 0 'force a recalc of the buttons.
			End Using
		End Sub


		Private Sub UpdatePages()
			edPage.Text = String.Format("{0} of {1}", MainPreview.StartPage, MainPreview.TotalPages)
		End Sub

		Private Sub flexCelPreview1_StartPageChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MainPreview.StartPageChanged
			UpdatePages()
		End Sub

		Private Sub ChangePages()
			Dim s As String = edPage.Text.Trim()
			Dim pos As Integer = 0
			Do While pos < s.Length AndAlso s.Chars(pos) >= "0"c AndAlso s.Chars(pos) <= "9"c
				pos += 1
			Loop
			If pos > 0 Then
				Dim page As Integer = MainPreview.StartPage
				Try
					page = Convert.ToInt32(s.Substring(0, pos))
				Catch e1 As Exception
				End Try

				MainPreview.StartPage = page
			End If
			UpdatePages()
		End Sub

		Private Sub edPage_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles edPage.Leave
			ChangePages()
		End Sub

		Private Sub edPage_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles edPage.KeyPress
			If e.KeyChar = ChrW(13) Then
				ChangePages()
			End If
			If e.KeyChar = ChrW(27) Then
				UpdatePages()
			End If
		End Sub

		Private Sub flexCelPreview1_ZoomChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MainPreview.ZoomChanged
			UpdateZoom()
		End Sub

		Private Sub UpdateZoom()
			edZoom.Text = String.Format("{0}%", CInt(Fix(Math.Round(MainPreview.Zoom * 100))))
			If MainPreview.AutofitPreview = TAutofitPreview.None Then
				UpdateAutofitText()
			End If
		End Sub

		Private Sub ChangeZoom()
			Dim s As String = edZoom.Text.Trim()
			Dim pos As Integer = 0
			Do While pos < s.Length AndAlso s.Chars(pos) >= "0"c AndAlso s.Chars(pos) <= "9"c
				pos += 1
			Loop
			If pos > 0 Then
				Dim zoom As Integer = CInt(Fix(Math.Round(MainPreview.Zoom * 100)))
				Try
					zoom = Convert.ToInt32(s.Substring(0, pos))
				Catch e1 As Exception
				End Try

				MainPreview.Zoom = zoom / 100.0
			End If
			UpdateZoom()
		End Sub

		Private Sub edZoom_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles edZoom.KeyPress
			If e.KeyChar = ChrW(13) Then
				ChangeZoom()
			End If
			If e.KeyChar = ChrW(27) Then
				UpdateZoom()
			End If
		End Sub

		Private Sub edZoom_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles edZoom.Enter
			ChangeZoom()
		End Sub

		Private Sub btnClose_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnClose.Click
			Close()
		End Sub

		Private Sub openFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles openFile.Click
			If openFileDialog.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
				Return
			End If
			LoadFile(openFileDialog.FileName)
		End Sub

		'The event that will actually provide the password to open the empty form.
		Private Sub GetPassword(ByVal e As OnPasswordEventArgs)
			Dim Pwd As New PasswordForm()
			e.Password = String.Empty
			If Pwd.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
				Return
			End If
			e.Password = Pwd.Password
		End Sub


		Friend Sub LoadFile(ByVal FileName As String)
			openFileDialog.FileName = FileName
			lbSheets.Items.Clear()

			Dim xls As New XlsFile()
			xls.HeadingColWidth = -1
			xls.HeadingRowHeight = -1
			AddHandler xls.Protection.OnPassword, AddressOf GetPassword
			xls.Open(FileName)

			For i As Integer = 1 To xls.SheetCount
				lbSheets.Items.Add(xls.GetSheetName(i))
			Next i

			lbSheets.SelectedIndex = xls.ActiveSheet - 1

			flexCelImgExport1.Workbook = xls
			MainPreview.InvalidatePreview()
			Text = "Custom Preview: " & openFileDialog.FileName
			'btnHeadings.Checked = flexCelImgExport1.Workbook.PrintHeadings;
			'btnGridLines.Checked = flexCelImgExport1.Workbook.PrintGridLines;
			btnFirst.Enabled = True
			btnPrev.Enabled = True
			btnNext.Enabled = True
			btnLast.Enabled = True
			edPage.Enabled = True
			btnZoomIn.Enabled = True
			edZoom.Enabled = True
			btnZoomOut.Enabled = True
			btnGridLines.Enabled = True
			btnHeadings.Enabled = True
			btnRecalc.Enabled = True
			btnPdf.Enabled = True

		End Sub

		Private Sub btnFirst_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFirst.Click
			MainPreview.StartPage = 1
		End Sub

		Private Sub btnPrev_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrev.Click
			MainPreview.StartPage -= 1
		End Sub

		Private Sub btnNext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnNext.Click
			MainPreview.StartPage += 1
		End Sub

		Private Sub btnLast_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLast.Click
			MainPreview.StartPage = MainPreview.TotalPages
		End Sub

		Private Sub btnZoomOut_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnZoomOut.Click
			MainPreview.Zoom -= 0.1
		End Sub

		Private Sub btnZoomIn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnZoomIn.Click
			MainPreview.Zoom += 0.1
		End Sub

		Private Sub lbSheets_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbSheets.SelectedIndexChanged
			If flexCelImgExport1.Workbook Is Nothing Then
				Return
			End If
			If lbSheets.Items.Count > flexCelImgExport1.Workbook.SheetCount Then
				Return
			End If
			flexCelImgExport1.Workbook.ActiveSheet = lbSheets.SelectedIndex + 1
			MainPreview.InvalidatePreview()
		End Sub

		Private Sub btnPdf_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPdf.Click
			If flexCelImgExport1.Workbook Is Nothing Then
				MessageBox.Show("There is no open file")
				Return
			End If
			If PdfSaveFileDialog.ShowDialog() <> System.Windows.Forms.DialogResult.OK Then
				Return
			End If

			Using PdfExport As New FlexCelPdfExport(flexCelImgExport1.Workbook, True)
				If Not DoExportToPdf(PdfExport) Then
					Return
				End If
			End Using

			If MessageBox.Show("Do you want to open the generated file?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) <> System.Windows.Forms.DialogResult.Yes Then
				Return
			End If
			Process.Start(PdfSaveFileDialog.FileName)
		End Sub

		Private Function DoExportToPdf(ByVal PdfExport As FlexCelPdfExport) As Boolean
			Dim MyPdfThread As New PdfThread(PdfExport, PdfSaveFileDialog.FileName, cbAllSheets.Checked)
			Dim PdfExportThread As New Thread(New ThreadStart(AddressOf MyPdfThread.ExportToPdf))
			PdfExportThread.Start()
			Using Pg As New PdfProgressDialog()
				Pg.ShowProgress(PdfExportThread, PdfExport)
				If Pg.DialogResult <> System.Windows.Forms.DialogResult.OK Then
					PdfExport.Cancel()
					PdfExportThread.Join() 'We could just leave the thread running until it dies, but there are 2 reasons for waiting until it finishes:
											'1) We could dispose it before it ends. This is workaroundable.
											'2) We might change its workbook object before it ends (by loading other file). This will surely bring issues.
					Return False
				End If

				If MyPdfThread IsNot Nothing AndAlso MyPdfThread.MainException IsNot Nothing Then
					Throw MyPdfThread.MainException
				End If
			End Using
			Return True
		End Function

		Private Sub cbAllSheets_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbAllSheets.CheckedChanged
			lbSheets.Visible = Not cbAllSheets.Checked
			sheetSplitter.Visible = lbSheets.Visible
			flexCelImgExport1.AllVisibleSheets = cbAllSheets.Checked
			If flexCelImgExport1.Workbook Is Nothing Then
				Return
			End If
			MainPreview.InvalidatePreview()

		End Sub

		Private Sub btnRecalc_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRecalc.Click
			If flexCelImgExport1.Workbook Is Nothing Then
				MessageBox.Show("Please open a file before recalculating.")
				Return
			End If
			flexCelImgExport1.Workbook.Recalc(True)
			MainPreview.InvalidatePreview()

		End Sub


		Private Sub mainForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
		End Sub

		Private Sub btnHeadings_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnHeadings.Click
			Dim xls As ExcelFile = flexCelImgExport1.Workbook
			If xls Is Nothing Then
				Return
			End If

			If cbAllSheets.Checked Then
				Dim SaveActiveSheet As Integer = xls.ActiveSheet
				For sheet As Integer = 1 To xls.SheetCount
					xls.ActiveSheet = sheet
					xls.PrintHeadings = btnHeadings.Checked
				Next sheet
				xls.ActiveSheet = SaveActiveSheet
			Else
				xls.PrintHeadings = btnHeadings.Checked
			End If
			MainPreview.InvalidatePreview()

		End Sub

		Private Sub btnGridLines_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGridLines.Click
			Dim xls As ExcelFile = flexCelImgExport1.Workbook
			If xls Is Nothing Then
				Return
			End If

			If cbAllSheets.Checked Then
				Dim SaveActiveSheet As Integer = xls.ActiveSheet
				For sheet As Integer = 1 To xls.SheetCount
					xls.ActiveSheet = sheet
					xls.PrintGridLines = btnGridLines.Checked
				Next sheet
				xls.ActiveSheet = SaveActiveSheet
			Else
				xls.PrintGridLines = btnGridLines.Checked
			End If
			MainPreview.InvalidatePreview()

		End Sub

		Private Sub noneToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles noneToolStripMenuItem.Click
			MainPreview.AutofitPreview = TAutofitPreview.None
			UpdateAutofitText()
		End Sub

		Private Sub fitToWidthToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles fitToWidthToolStripMenuItem.Click
			MainPreview.AutofitPreview = TAutofitPreview.Width
			UpdateAutofitText()
		End Sub

		Private Sub fitToHeightToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles fitToHeightToolStripMenuItem.Click
			MainPreview.AutofitPreview = TAutofitPreview.Height
			UpdateAutofitText()
		End Sub

		Private Sub fitToPageToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles fitToPageToolStripMenuItem.Click
			MainPreview.AutofitPreview = TAutofitPreview.Full
			UpdateAutofitText()
		End Sub

		Private Sub UpdateAutofitText()
			Select Case MainPreview.AutofitPreview
				Case TAutofitPreview.None
					btnAutofit.Text = "No Autofit"
				Case TAutofitPreview.Width
					btnAutofit.Text = "Fit to Width"
				Case TAutofitPreview.Height
					btnAutofit.Text = "Fit to Height"
				Case TAutofitPreview.Full
					btnAutofit.Text = "Fit to Page"
				Case Else
			End Select

		End Sub

	End Class

	#Region "PdfThread"
	Friend Class PdfThread
		Private PdfExport As FlexCelPdfExport
		Private FileName As String
		Private AllVisibleSheets As Boolean
		Private FMainException As Exception

		Friend Sub New(ByVal aPdfExport As FlexCelPdfExport, ByVal aFileName As String, ByVal aAllVisibleSheets As Boolean)
			PdfExport = aPdfExport
			FileName = aFileName
			AllVisibleSheets = aAllVisibleSheets
		End Sub

		Friend Sub ExportToPdf()
			Try
				If AllVisibleSheets Then
					Try
						Using f As New FileStream(FileName, FileMode.Create, FileAccess.Write)
							PdfExport.BeginExport(f)
							PdfExport.PageLayout = TPageLayout.Outlines
							PdfExport.ExportAllVisibleSheets(False, System.IO.Path.GetFileNameWithoutExtension(FileName))
							PdfExport.EndExport()
						End Using
					Catch
						Try
							File.Delete(FileName)
						Catch
							'Not here.
						End Try
						Throw
					End Try
				Else
					PdfExport.PageLayout = TPageLayout.None
					PdfExport.Export(FileName)
				End If
			Catch ex As Exception
				FMainException = ex
			End Try
		End Sub

		Friend ReadOnly Property MainException() As Exception
			Get
				Return FMainException
			End Get
		End Property
	End Class
	#End Region


End Namespace

PasswordForm.Designer.vb

Imports System.ComponentModel
Namespace CustomPreview
	Partial Public Class PasswordForm
		Inherits System.Windows.Forms.Form

		Private label1 As System.Windows.Forms.Label
		Private btnOk As System.Windows.Forms.Button
		Private label3 As System.Windows.Forms.Label
		Private PasswordEdit As System.Windows.Forms.TextBox
		''' <summary>
		''' Required designer variable.
		''' </summary>
		Private components As System.ComponentModel.Container = Nothing

		''' <summary>
		''' Clean up any resources being used.
		''' </summary>
		Protected Overrides Sub Dispose(ByVal disposing As Boolean)
			If disposing Then
				If components IsNot Nothing Then
					components.Dispose()
				End If
			End If
			MyBase.Dispose(disposing)
		End Sub

		#Region "Windows Form Designer generated code"
		''' <summary>
		''' Required method for Designer support - do not modify
		''' the contents of this method with the code editor.
		''' </summary>
		Private Sub InitializeComponent()
			Me.label1 = New System.Windows.Forms.Label()
			Me.btnOk = New System.Windows.Forms.Button()
			Me.label3 = New System.Windows.Forms.Label()
			Me.PasswordEdit = New System.Windows.Forms.TextBox()
			Me.SuspendLayout()
			' 
			' label1
			' 
			Me.label1.Location = New System.Drawing.Point(24, 16)
			Me.label1.Name = "label1"
			Me.label1.Size = New System.Drawing.Size(240, 23)
			Me.label1.TabIndex = 0
			Me.label1.Text = "Please enter the password to open this file:"
			' 
			' btnOk
			' 
			Me.btnOk.DialogResult = System.Windows.Forms.DialogResult.OK
			Me.btnOk.Location = New System.Drawing.Point(152, 112)
			Me.btnOk.Name = "btnOk"
			Me.btnOk.TabIndex = 1
			Me.btnOk.Text = "Ok"
			' 
			' label3
			' 
			Me.label3.Location = New System.Drawing.Point(40, 64)
			Me.label3.Name = "label3"
			Me.label3.Size = New System.Drawing.Size(64, 23)
			Me.label3.TabIndex = 5
			Me.label3.Text = "Password:"
			' 
			' PasswordEdit
			' 
			Me.PasswordEdit.Anchor = (CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles))
			Me.PasswordEdit.Location = New System.Drawing.Point(112, 64)
			Me.PasswordEdit.Name = "PasswordEdit"
			Me.PasswordEdit.PasswordChar = "*"c
			Me.PasswordEdit.Size = New System.Drawing.Size(200, 20)
			Me.PasswordEdit.TabIndex = 0
			Me.PasswordEdit.Text = ""
			' 
			' PasswordForm
			' 
			Me.AcceptButton = Me.btnOk
			Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
			Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
			Me.ClientSize = New System.Drawing.Size(408, 154)
			Me.Controls.Add(Me.label3)
			Me.Controls.Add(Me.PasswordEdit)
			Me.Controls.Add(Me.btnOk)
			Me.Controls.Add(Me.label1)
			Me.Name = "PasswordForm"
			Me.ShowInTaskbar = False
			Me.Text = "File is password protected."
			Me.ResumeLayout(False)

		End Sub
		#End Region
	End Class
End Namespace


PasswordForm.vb

Imports System.ComponentModel

Namespace CustomPreview
	''' <summary>
	''' Form for asking for a password when the file is password protected.
	''' </summary>
	Partial Public Class PasswordForm
		Inherits System.Windows.Forms.Form

		Public Sub New()
			InitializeComponent()
		End Sub

		Public ReadOnly Property Password() As String
			Get
				Return PasswordEdit.Text
			End Get
		End Property
	End Class
End Namespace

PdfProgressDialog.Designer.vb

Imports System.ComponentModel
Imports System.Threading
Imports FlexCel.Render
Namespace CustomPreview
	Partial Public Class PdfProgressDialog
		Inherits System.Windows.Forms.Form

		Private btnCancel As System.Windows.Forms.Button
		Private statusBar1 As System.Windows.Forms.StatusBar
		Private statusBarPanel1 As System.Windows.Forms.StatusBarPanel
		Private statusBarPanelTime As System.Windows.Forms.StatusBarPanel
		Private labelPages As System.Windows.Forms.Label
		''' <summary>
		''' Required designer variable.
		''' </summary>
		Private components As System.ComponentModel.Container = Nothing

		''' <summary>
		''' Clean up any resources being used.
		''' </summary>
		Protected Overrides Sub Dispose(ByVal disposing As Boolean)
			If disposing Then
				If components IsNot Nothing Then
					components.Dispose()
				End If
			End If
			MyBase.Dispose(disposing)
		End Sub

		#Region "Windows Form Designer generated code"
		''' <summary>
		''' Required method for Designer support - do not modify
		''' the contents of this method with the code editor.
		''' </summary>
		Private Sub InitializeComponent()
			Me.btnCancel = New System.Windows.Forms.Button()
			Me.statusBar1 = New System.Windows.Forms.StatusBar()
			Me.statusBarPanel1 = New System.Windows.Forms.StatusBarPanel()
			Me.statusBarPanelTime = New System.Windows.Forms.StatusBarPanel()
			Me.labelPages = New System.Windows.Forms.Label()
			Me.timer1 = New System.Timers.Timer()
			CType(Me.statusBarPanel1, System.ComponentModel.ISupportInitialize).BeginInit()
			CType(Me.statusBarPanelTime, System.ComponentModel.ISupportInitialize).BeginInit()
			CType(Me.timer1, System.ComponentModel.ISupportInitialize).BeginInit()
			Me.SuspendLayout()
			' 
			' btnCancel
			' 
			Me.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Bottom
			Me.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
			Me.btnCancel.Location = New System.Drawing.Point(184, 64)
			Me.btnCancel.Name = "btnCancel"
			Me.btnCancel.TabIndex = 0
			Me.btnCancel.Text = "Cancel"
			' 
			' statusBar1
			' 
			Me.statusBar1.Location = New System.Drawing.Point(0, 100)
			Me.statusBar1.Name = "statusBar1"
			Me.statusBar1.Panels.AddRange(New System.Windows.Forms.StatusBarPanel() { Me.statusBarPanel1, Me.statusBarPanelTime})
			Me.statusBar1.ShowPanels = True
			Me.statusBar1.Size = New System.Drawing.Size(448, 22)
			Me.statusBar1.TabIndex = 1
			' 
			' statusBarPanel1
			' 
			Me.statusBarPanel1.BorderStyle = System.Windows.Forms.StatusBarPanelBorderStyle.None
			Me.statusBarPanel1.Text = "Elapsed Time:"
			Me.statusBarPanel1.Width = 80
			' 
			' statusBarPanelTime
			' 
			Me.statusBarPanelTime.BorderStyle = System.Windows.Forms.StatusBarPanelBorderStyle.None
			Me.statusBarPanelTime.Text = "0:00"
			' 
			' labelPages
			' 
			Me.labelPages.Anchor = (CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles))
			Me.labelPages.Location = New System.Drawing.Point(16, 16)
			Me.labelPages.Name = "labelPages"
			Me.labelPages.Size = New System.Drawing.Size(408, 16)
			Me.labelPages.TabIndex = 2
			' 
			' timer1
			' 
			Me.timer1.Enabled = True
			Me.timer1.SynchronizingObject = Me
'			Me.timer1.Elapsed += New System.Timers.ElapsedEventHandler(Me.timer1_Elapsed)
			' 
			' PdfProgressDialog
			' 
			Me.AutoScaleDimensions = New System.Drawing.SizeF(6F, 13F)
			Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
			Me.ClientSize = New System.Drawing.Size(448, 122)
			Me.ControlBox = False
			Me.Controls.Add(Me.labelPages)
			Me.Controls.Add(Me.statusBar1)
			Me.Controls.Add(Me.btnCancel)
			Me.MaximizeBox = False
			Me.MinimizeBox = False
			Me.Name = "PdfProgressDialog"
			Me.ShowInTaskbar = False
			Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
			Me.Text = "Please wait..."
'			Me.Closed += New System.EventHandler(Me.PdfProgressDialog_Closed)
			CType(Me.statusBarPanel1, System.ComponentModel.ISupportInitialize).EndInit()
			CType(Me.statusBarPanelTime, System.ComponentModel.ISupportInitialize).EndInit()
			CType(Me.timer1, System.ComponentModel.ISupportInitialize).EndInit()
			Me.ResumeLayout(False)

		End Sub
		#End Region
	End Class
End Namespace


PdfProgressDialog.vb

Imports System.ComponentModel

Imports System.Threading

Imports FlexCel.Render

Namespace CustomPreview
	''' <summary>
	''' Shows progress as we are exporting to pdf.
	''' </summary>
	Partial Public Class PdfProgressDialog
		Inherits System.Windows.Forms.Form

		Private WithEvents timer1 As System.Timers.Timer

		Public Sub New()
			InitializeComponent()
		End Sub


		Private StartTime As Date
		Private RunningThread As Thread
		Private PdfExport As FlexCelPdfExport

		Private Sub timer1_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles timer1.Elapsed
			UpdateStatus()
		End Sub

		Public Sub ShowProgress(ByVal aRunningThread As Thread, ByVal aPdfExport As FlexCelPdfExport)
			RunningThread = aRunningThread

			If Not RunningThread.IsAlive Then
				DialogResult = System.Windows.Forms.DialogResult.OK
				Return
			End If
			timer1.Enabled = True
			StartTime = Date.Now
			PdfExport = aPdfExport
			ShowDialog()
		End Sub

		Private Sub UpdateStatus()
			Dim ts As TimeSpan = Date.Now.Subtract(StartTime)
			Dim hours As String
			If ts.Hours = 0 Then
				hours = ""
			Else
				hours = ts.Hours.ToString("00") & ":"
			End If
			statusBarPanelTime.Text = hours & ts.Minutes.ToString("00") & ":" & ts.Seconds.ToString("00")

			If Not RunningThread.IsAlive Then
				DialogResult = System.Windows.Forms.DialogResult.OK
			End If

			If PdfExport.Progress.TotalPage > 0 Then
				labelPages.Text = String.Format("Generating Page {0} of {1}", PdfExport.Progress.Page, PdfExport.Progress.TotalPage)
			End If
		End Sub

		Private Sub PdfProgressDialog_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
			timer1.Enabled = False
		End Sub


	End Class
End Namespace

Program.vb

Namespace CustomPreview
	Friend NotInheritable Class Program

		Private Sub New()
		End Sub

		''' <summary>
		''' The main entry point for the application.
		''' </summary>
		<STAThread> _
		Shared Sub Main(ByVal Args() As String)
			Application.EnableVisualStyles()
			Application.SetCompatibleTextRenderingDefault(False)
			Application.Run(New mainForm(Args))
		End Sub
	End Class
End Namespace