티스토리 뷰

프로그래밍

C#에서 PDF출력하기

야라바 2015. 6. 2. 15:29


C# 프로그래밍 과정에서 고객의 요청 때문에 PDF 파일을 만드는 경우도 있지만 프로그램 자체에 PDF 생성 기능이 있으면 여러모로 활용도가 넓어질 수 있습니다. 가장 큰 장점은 보고서 인쇄를 대치할 수 있다는 것입니다. SAP이 배포하고 있는 크리스탈 리포트(Crystal Reports)를 사용하여 보고서 인쇄 기능을 개발할 수도 있지만 필자의 경우에는 SAP이 개발자용 자료를 그냥 다운로드 시켜주지도 않고(복잡한 등록 양식을 요구함) 배포 시점에 SAP의 패키지를 추가로 배포해야하는 부담이 귀찮은 것도 있었지만 생성된 보고서 파일을 부가적으로 활용할 수 있도록 해줌과 동시에 PDF 자체의 인쇄 조절 기능등을 활용할 수 있다는 장점을 보고 PDF를 통한 보고서 출력을 시도하게 되었습니다.


PDF 생성을 위한 라이브러리는 http://sourceforge.net/projects/itextsharp/files에서 최신 버전을 다운로드 받습니다. 저는 itextsharp-all-5.5.6.zip를 다운로드 받았는데 파일 내용은 DLL 파일과 함께 소스 파일을 함께 배포하고 있습니다. 압축파일은 core, pdfa, xtra로 구성되는데 단순한 PDF 출력이라면 core만 사용해도 무방합니다. 배포하고 있는 소스를 솔루션에 포함시켜서 사용하는 것도 방법이지만 그냥 DLL만 프로젝트에 참조로 포함시켜서 사용하는 방법도 좋습니다.

PDF 생성시에 필요한 것이 하나 더  있는데 한글 출력을 위한 iTextAsian 파일입니다. 이 파일은 코드 내에서 참조로 사용하지는 않고 폰트 준비 과정에 해당 DLL를 사용하도록 설정하는 방식으로 적용합니다. 다운로드는 http://sourceforge.net/projects/itextsharp/files/extras 에서 iTextAsian-all-2.1.zip를 내려받았습니다. 소스와 DLL을 모두 배포하므로 개발자 취향에 따라 소스를 같이 빌드하거나 DLL만 실행 경로에 포함되도록 합니다.

using iTextSharp.text;

using iTextSharp.text.pdf;


위와 같이 모듈 참조를 기술해주고 코드를 작성합니다. 아래의 예제 코드는 DataTable 형식의 dt에 3가지 컬럼으로 구성된 데이터를 입력해서 pdfname로 지정한 파일명으로 PDF 파일을 저장하는 내용입니다. PDF의 내용은 3가지 컬럼의 내용을 테이블 형식으로 출력하는 단순한 형태입니다. 한글 폰트는 시스템 폰트나 별도 내장 폰트가 아니라 어도비사가 PDF에 포함하고 있는 기본 폰트를 사용하도록 했습니다.
Document document = new Document(PageSize.A4);
iTextSharp.text.io.StreamUtil.AddToResourceSearch("iTextAsian.dll");

PdfWriter writer = PdfWriter.GetInstance(document,new FileStream(pdfname, FileMode.Create));

document.Open();

PdfPTable tbl = new PdfPTable(dt.Columns.Count);
float[] widths = new float[] { 200f, 400f, 700f };
// HYGoThic-Medium, HYSMyeongJo-Medium, HYSMyeongJoStd-Medium | UniKS-UCS2-H, UniKS-UCS2-V
iTextSharp.text.Font tfnt = new iTextSharp.text.Font(BaseFont.CreateFont("HYGoThic-Medium", 
    "UniKS-UCS2-H", BaseFont.NOT_EMBEDDED), 14, iTextSharp.text.Font.BOLD);
iTextSharp.text.Font pfnt = new iTextSharp.text.Font(BaseFont.CreateFont("HYGoThic-Medium", 
    "UniKS-UCS2-H", BaseFont.NOT_EMBEDDED), 9, iTextSharp.text.Font.NORMAL);

tbl.SetWidths(widths);
tbl.WidthPercentage = 100;

PdfPCell cell = new PdfPCell(new Phrase("기록 조회", tfnt));
cell.Colspan = dt.Columns.Count;
cell.Border = (int)TableLayoutPanelCellBorderStyle.None;
cell.HorizontalAlignment = Element.ALIGN_CENTER;
tbl.AddCell(cell);

PdfPCell hcell = new PdfPCell();
hcell.HorizontalAlignment = Element.ALIGN_CENTER;
hcell.BorderWidthBottom = 2;
hcell.Padding = 3;
foreach (DataColumn c in dt.Columns)
{
    hcell.Phrase = new Phrase(c.ColumnName, pfnt);

    tbl.AddCell(hcell);
}

foreach (DataRow r in dt.Rows)
{
    tbl.AddCell(new Phrase(r[0].ToString(), pfnt));
    tbl.AddCell(new Phrase(r[1].ToString(), pfnt));
    tbl.AddCell(new Phrase(r[2].ToString(), pfnt));
    tbl.CompleteRow();
} 
document.Add(tbl);
document.Close();

자세한 사용법은 아래의 그림처럼 비주얼스튜디오의 인텔리센스 기능이 제공하는 옵션들을 참조하시면 되겠습니다. 어도비사가 PDF에 기본으로 포함하고 있는 폰트는 HYGoThic-Medium, HYSMyeongJo-Medium, HYSMyeongJoStd-Medium 이고 UniKS-UCS2-H는 가로쓰기 UniKS-UCS2-V는 세로쓰기를 의미합니다. 한글이 없다면 Core만으로도 PDF 생성이 문제가 없지만 한글이 포함된 경우에는 "AddToResourceSearch("iTextAsian.dll")" 문장을 반드시 포함시켜 주어야 합니다.

iTextSharp을 활용한 PDF출력은 코드만 보면 양식을 만드는 작업등 어려워 보일 수도 있지만 바코드 출력이나 HTML 기반으로 PDF를 제작하는 XML Worker등 다양한 활용 가능성이 있을 것으로 보입니다. 미리 준비된 양식에 데이터를 채우는 메일머지 성격의 PDF 작성도 가능하므로(http://itextpdf.com/examples/iia.php?id=157 참조) 활용 범위는 매우 넓고 개발 용이성도 좋아 보입니다.



댓글
댓글쓰기 폼