[C#] PDFを作成する方法(iTextSharp)


Devlopment note / C#    作成日付 : 2020/05/03 10:22:40   修正日付 : 2020/05/03 10:22:40

こんにちは。明月です。


この投稿はCでPDFを作成する方法(iTextSharp)に関する説明です。


プログラムを運用すれば結果レポートや帳票などを出力する場合が多いです。その時にCSVファイルやExcelファイル、XMLファイルタイプで出力する場合があります。

その中で契約書やデータ形式ではなくドキュメント形式、でも編集ができないタイプで出力したい場合はPDFを利用します。


C#でPDFを出力するために提供するオープンライブラリはiTextSharpがあります。iTextSharpを使うためにNugetを利用してダウンロードして連携します。




iTextSharpライブラリを連携したらソースを作成してPDFを出力しましょう。

using System;
using System.Text;
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>	
    ";

      // ファイル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
        {
          // HTMLタイプでStringを反映するCSSファイルResolver
          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);
          // Windowフォントに設定した基本フォント
          font.Register(@"c:/windows/fonts/malgun.ttf", "MalgunGothic");
          // フォントを反映するCssAppliersクラス
          var cssAppliers = new CssAppliersImpl(font);

          // htmlContext生成(フォント反映)
          var htmlContext = new HtmlPipelineContext(cssAppliers);
          // Htmlタグファクトリー設定
          htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

          // pipeline生成
          var pdfPipeline = new PdfWriterPipeline(document, writer);
          // html pipline生成(Html内容とpdfpipelineを合成)
          var htmlPipeline = new HtmlPipeline(htmlContext, pdfPipeline);
          // css pipline生成(cssとhtmlpiplineを合成)
          var cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);

          // Work生成pipelineを入力
          var worker = new XMLWorker(cssResolverPipeline, true);
          // XML parser生成(Html -> 変換)	
          var xmlParser = new XMLParser(true, worker, Encoding.GetEncoding("UTF-8"));
          // ParserでHtmlStringを入力
          using (StringReader strReader = new StringReader(html))
          {
            xmlParser.Parse(strReader);
          }
        }
        finally
        {
          // document Close	
          document.Close();
        }
      }
      Console.WriteLine("Press Any Key...");
      Console.ReadKey();
    }
  }
}

上のHtmlからファイルを生成することまで下記の流れになります。

「FileStream -> PdfWriter取得 -> PdfWriterPipeline生成 -> HtmlPipeline生成 -> CssResolverPipeline生成 -> XMLWorker生成 -> XMLParser生成 -> XMLParserによってHtmlをPDFに変換する。」ということになります。

// ドキュメントにフォント設定
body {
  font-family: MalgunGothic;
}
// divタグに背景と文字色設定
div {
  background-color: red;
  color: blue;
}

上のCSSファイルを実行するデバッグフォルダに置きます。


実行すると「simple.pdf」というPDFファイルが生成されます。


結果は上のとおりに出ました。

私は簡単にソースを作成しましたが、少しHTML作成する部分とCSSを紐づく部分を整理すると一般プロジェクトにも十分に使えると思います。


ここまでCでPDFを作成する方法(iTextSharp)に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿