使用iTextSharp生成PDF报告

在众多的PDF报告生成工具中,iTextSharp是一个功能强大且常用的库。虽然它不是完全免费的,但它提供了丰富的功能来满足需求。本文将介绍如何在ASP.NET项目中使用iTextSharp来生成PDF报告,包括数据的获取、格式化、添加页码以及页眉页脚等。

本项目是在ASP.NET环境下使用C#语言开发的。数据库使用的是Access数据库,但同样适用于SQL Server。为了方便演示,这里使用了Access数据库。文章将介绍如何从多个表中获取数据,并生成带有页眉、页脚的PDF文件,同时在每个PDF页面上插入页码。

使用代码

整个项目已经打包在zip文件中,可以直接下载并在项目中使用这个示例。文章的主要代码如下所示。但在使用这段代码之前,需要在项目引用中添加iTextSharp版本4.1.2.0的DLL文件,并在*.cs页面的顶部导入这个文件。这些内容都在可下载的zip文件中展示了。

从多个表中获取数据,使用的表包括CustomerOrder和OrderedItem,这些在下面的代码中也有展示。使用DataRelation特性来结合两个表,并自动计算并显示总和。代码如下:

string catQuery = @" select * from CustomerOrder"; OleDbCommand objCmd = new OleDbCommand(catQuery, cnx); OleDbDataAdapter objDAcategory = new OleDbDataAdapter(objCmd); objDAcategory.Fill(ds, "CustomerOrder"); string totQuery = @" select OrderID,sum(Amount) as [TotalAmount] from OrderedItem where IsActive = '1' group by OrderID"; objCmd = new OleDbCommand(totQuery, cnx); OleDbDataAdapter objDAtotal = new OleDbDataAdapter(objCmd); objDAtotal.Fill(ds, "OrderedItem"); string itemQuery = @" select * from OrderedItem where IsActive='1'"; objCmd = new OleDbCommand(itemQuery, cnx); OleDbDataAdapter objDAitem = new OleDbDataAdapter(objCmd); objDAitem.Fill(ds, "OrderedItem");

接下来,创建DataRelation来关联这两个表:

DataRelation dRel = new DataRelation( "CustomerOrder_OrderedItem", ds.Tables["CustomerOrder"].Columns["OrderID"], ds.Tables["OrderedItem"].Columns["OrderID"]); ds.Relations.Add(dRel); cusDptInfo.DataSource = ds; cusDptInfo.DataBind();

以下代码展示了如何将数据写入PDF文件。Document变量pdfDoc被定义为A4大小的纸张,并设置了边距值。

HttpContext.Current.Response.Clear(); HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=iTextSharpExample.pdf"); HttpContext.Current.Response.Charset = ""; HttpContext.Current.Response.ContentType = "application/pdf"; StringWriter stringwrite = new StringWriter(); HtmlTextWriter htmlwrite = new HtmlTextWriter(stringwrite); cusDptInfo.RenderControl(htmlwrite); StringReader sr = new StringReader(stringwrite.ToString()); Document pdfDoc = new Document(PageSize.A4, 50f, 50f, 40f, 40f); PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream); HTMLWorker htmlparser = new HTMLWorker(pdfDoc);

以下代码片段用于计算页码。

string pcnt; pcnt = (writer.CurrentPageNumber - 1).ToString(); pcnt = pcnt.Substring(1);

以下代码展示了如何在PDF文件中实现页眉和页脚,包括对齐和边框样式。

HeaderFooter header = new HeaderFooter( new Phrase("My Company \n Customer Order Details"), false) { Border = Rectangle.NO_BORDER, Alignment = Element.ALIGN_CENTER }; HeaderFooter footer = new HeaderFooter( new Phrase(pcnt), true) { Border = Rectangle.NO_BORDER, Alignment = Element.ALIGN_CENTER }; pdfDoc.Header = header; pdfDoc.Footer = footer; pdfDoc.Open();

以下代码片段用于在PDF文件的所有页面上显示当前日期。

_events e = new _events(); e.TimerText = DateTime.Now.ToString("MM/dd/yyyy"); writer.PageEvent = e; <asp:Repeater runat="server" ID="cusDptInfo" onitemdatabound="cusDptInfo_ItemDataBound"> <ItemTemplate> <font size="60%"> <b> <%# DataBinder.Eval(Container.DataItem, "FirstName") %> <%# DataBinder.Eval(Container.DataItem, "LastName") %> </b> <br/> <%# DataBinder.Eval(Container.DataItem, "GroupName") %> <br/> <%# DataBinder.Eval(Container.DataItem, "Email") %> <br/> <%# DataBinder.Eval(Container.DataItem, "CreationDate", "{0:MM/dd/yyyy}") %> <br/> <br/> </font> </ItemTemplate> </asp:Repeater>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485