본문 바로가기

.NET/ASP.NET

PDF파일로 리포팅 하기


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>
 
위의 코드는 핵심 코드만 간단히 설명한 코드입니다. 자세한 내용을 보려면 위의 링크에서 프로젝트를 다운받으세요