http://www.codeproject.com/KB/aspnet/MainPage.aspx
이 내용은 위의 글을 토대로 만들어 졌으며 내용이 다소 상이할 수 있습니다. 소스는 위 URL에서 다운 받으실수 있습니다.
1. 소개
많은 사람들이 pdf 파일로 리포팅을 하기원합니다. 그러나 무료로 사용하기 위한 적당한 툴을 찾기란 쉽지 않습니다.
iTextSharp.dll 이라는 라이브러리는 pdf로 리포팅하는 라이브러리인데 여기서는 이 라이브러리의 사용법에 대해서 소개하고자 합니다.
2. 배경
이 예제는 ASP.NET C#으로 되어있고 데에터 베이스는 Access Database를 사용하였습니다. 많은 분들이 sql server를 사용하고 계실텐데 sql server도 잘 돌아갑니다. 이 내용은 pdf에 헤더나 푸터 그리고 페이지 번호까지 삽입하는 가장 쉬운 방법을 소개합니다.
3.코드 작성하기
가장 핵심이 되는 코드는 아래의 내용입니다.
먼저 엑세스 데이터 베이스에 데이터들을 각각 DataSet에 채워넣습니다.
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 dRel = new DataRelation("CustomerOrder_OrderedItem", ds.Tables["CustomerOrder"].Columns["OrderID"], ds.Tables["OrderedItem"].Columns["OrderID"]); ds.Relations.Add(dRel); cusDptInfo.DataSource = ds; cusDptInfo.DataBind();
위의 DataSet을 PDF로 쓰는 코드입니다.
HttpContext.Current.Response.Clear(); //clear anything in io buffer
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);
다음 코드는 page number를 삽입하는 코드입니다.
string pcnt;
pcnt = (writer.CurrentPageNumber - 1).ToString();
pcnt = pcnt.Substring(1);
다음 코드는 헤더 푸터 그리고 정렬 보더스타일을 지정해주는 코드입니다.
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();
다음 코드는 리포트를 생성할때 현재의 날짜를 삽입하는 코드입니다.
_events e = new _events();
e.TimerText = DateTime.Now.ToString("MM/dd/yyyy");
writer.PageEvent = e;
htmlparser.Parse(sr);
pdfDoc.NewPage();
아래의 코드는 리피터를 사용하여 데이터 바인딩을 하기 위한 코드입니다.
<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>
<asp:Repeater ID="rptItemList" runat="server">
<ItemTemplate>
<asp:Table ID="tblItemList" runat="server" Font-Size="7%">
<asp:TableRow>
<asp:TableCell><%# DataBinder.Eval(Container.DataItem,"Item")%> <%#DataBinder.Eval(Container.DataItem, "Category","({0})")%><br /><font color="gray" style="text-align:justify"><%# DataBinder.Eval(Container.DataItem, "ItemDescription") %></font></asp:TableCell>
<asp:TableCell HorizontalAlign="Right"><%# DataBinder.Eval(Container.DataItem,"Amount","{0:c}") %></asp:TableCell>
</asp:TableRow>
</asp:Table>
</ItemTemplate>
</asp:Repeater>
<asp:Repeater ID="rptOrderedTotAmount" runat="server">
<ItemTemplate>
<asp:Table ID="tblItemListt" runat="server" Font-Size="7%">
<asp:TableRow>
<asp:TableCell HorizontalAlign="Right"><%# DataBinder.Eval(Container.DataItem, "TotalAmount","<strong>Total: </strong>{0:c}") %></asp:TableCell>
</asp:TableRow>
</asp:Table>
<br />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
위의 코드는 핵심 코드만 간단히 설명한 코드입니다. 자세한 내용을 보려면 위의 링크에서 프로젝트를 다운받으세요