[C#] iTextSharp을 이용한 PDF 만들기


Development note/C#  2019. 5. 14. 23:46

안녕하세요. 명월입니다.

 

이번에는 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#의 라이브러리 함수명이 비슷해서 겨우 해결했습니다.

 

첨부파일입니다.

PdfExample.zip
0.32MB

 

참조 - https://zero-gravity.tistory.com/251

참조 - https://csharp.hotexamples.com/examples/iTextSharp.text/Document/Open/php-document-open-method-examples.html