안녕하세요. 명월입니다.
이번에는 C#내에서 PDF를 작성하는 방법을 소개합니다.
우리가 프로그램을 운영 중에 보면 결과 레포트를 출력하는 경우가 많이 있습니다. 그럴 경우 CSV 파일이나 Excel로 출력하는 경우도 있고 Xml로 데이터 형식으로 뽑아내는 경우가 있습니다.
그러나 계약서나 데이터 파일이 아닌 레포트형식의 출력물를 만들고 싶을 때는 PDF를 사용합니다.
C#에서 PDF를 지원하는 라이브러리는 ITextSharp이 있습니다. 우선 Nuget을 통해 해당 라이브러리를 다운, 참조하겠습니다.
다음은 소스를 작성하겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.pipeline.css;
using iTextSharp.tool.xml.css;
using iTextSharp.tool.xml.pipeline.html;
using iTextSharp.tool.xml.pipeline.end;
using iTextSharp.tool.xml.parser;
namespace PdfExample
{
class Program
{
static void Main(string[] args)
{
//HTML 형식의 String 데이터
var html = @"
<html>
<head></head>
<body>
<div>Hello world</div>
<div>명월입니다.</div>
</body>
</html>
";
CreatePDF(html);
Console.WriteLine("Press Any Key...");
Console.ReadKey();
}
private static void CreatePDF(string html)
{
// 파일 IO 스트림을 취득한다.
using (var stream = new FileStream(Environment.CurrentDirectory + "/simple.pdf", FileMode.Create, FileAccess.Write))
{
// Pdf형식의 document를 생성한다.
Document document = new Document(PageSize.A4, 10, 10, 10, 10);
// PdfWriter를 취득한다.
PdfWriter writer = PdfWriter.GetInstance(document, stream);
// document Open
document.Open();
try
{
var helper = XMLWorkerHelper.GetInstance();
var cssResolver = new StyleAttrCSSResolver();
// Css 파일 설정
using (var cssStream = new FileStream(Environment.CurrentDirectory + "/css1.css", FileMode.Open, FileAccess.Read))
{
cssResolver.AddCss(XMLWorkerHelper.GetCSS(cssStream));
}
using (var cssStream = new FileStream(Environment.CurrentDirectory + "/css2.css", FileMode.Open, FileAccess.Read))
{
cssResolver.AddCss(XMLWorkerHelper.GetCSS(cssStream));
}
// 폰트 설정
var font = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
//font.Register(Environment.CurrentDirectory + "/malgun.ttf", "MalgunGothic");
font.Register(@"c:/windows/fonts/malgun.ttf", "MalgunGothic");
var cssAppliers = new CssAppliersImpl(font);
//htmlContext 생성
var htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
//pipeline 생성.
var pdfPipeline = new PdfWriterPipeline(document, writer);
var htmlPipeline = new HtmlPipeline(htmlContext, pdfPipeline);
var cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
//Work 생성 pipeline 연결
var worker = new XMLWorker(cssResolverPipeline, true);
//Xml파서 생성(Html -> 변환)
var xmlParser = new XMLParser(true, worker, Encoding.GetEncoding("UTF-8"));
using (StringReader strReader = new StringReader(html))
{
xmlParser.Parse(strReader);
}
}
finally
{
// document Close
document.Close();
}
}
}
}
}
결과 화면입니다.
이 소스를 작업하면서 여러 소스를 참조했습니다. 그런데 많은 분들이 PDF의 한글 처리와 Css 연결에 애를 먹고 해결을 못한 분이 있는 듯 싶습니다. 저는 어떤 분이 자바로 고생해서 해결하고 블로그에 글을 작성해 놓았네요.
다행히도 Java와 C#의 라이브러리 함수명이 비슷해서 겨우 해결했습니다.
첨부파일입니다.
'Development note > C#' 카테고리의 다른 글
[C#] Gecko 라이브러리 (웹 스크래핑) (3) | 2019.06.06 |
---|---|
[C#] Zip 압축 코드 소스 (3) | 2019.06.03 |
[C#] System.Net.Mail을 이용하여 메일 보내기 (0) | 2019.05.28 |
[C#] Newtonsoft.JSON를 이용한 Json 다루기 (0) | 2019.05.15 |
[C#] NPOI를 이용하여 Excel를 읽어드리고 다시 출력하기 (0) | 2019.05.14 |
[C#] NPOI를 이용한 엑셀 파일 만들기 (1) | 2019.05.14 |
[C#] Zip 압축 해제 코드 소스 (0) | 2019.05.10 |
[C#] 계산기 프로그램 (1) | 2015.06.07 |