在众多的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>