[Java] PDFを出力する方法(itextpdf)


Devlopment note / Java    作成日付 : 2020/03/13 00:47:31   修正日付 : 2020/03/13 01:06:27

こんにちは。明月です。


この投稿はJavaでPDFを出力する方法(itextpdf)に関する説明です。

ウェブサービスで、特にポータルサービスならデータの結果を出力するところならPDF出力が多いです。最近はほとんどPDFの出力なら標準でなっているほど多いです。

PDFで出力したら修正もできないし、イメージよりドキュメント形式になっているフォーマットになっているのでです。


これをJava環境でPDFを作成して出力して使う方法に関して説明します。

Java環境で使うためにMavenレポジトリを通ってitextpdf」と「xmlworker」をしなければならないです。

repository - https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.13.1

repository - https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker/5.5.13.1

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itextpdf</artifactId>
  <version>5.5.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker -->
<dependency>
  <groupId>com.itextpdf.tool</groupId>
  <artifactId>xmlworker</artifactId>
  <version>5.5.13.1</version>
</dependency>


簡単なPDFを出力するプログラムを作成しましょう。コンソールで実行するとPDFが生成するプログラムです。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.net.URL;
import java.nio.charset.Charset;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
public class Main {
  // 実行関数
  public static void main(String[] args) {
    // PDFを作成するHTML
    String html = "<html>" +
                  "<head></head>" +
                  "<body>" +
                  "<div>Hello world</div>" +
                  "<div>明月です。</div>" +
                  "</body>" +
                  "</html>";
    // ファイルIOを取得する。
    // 出力パスは"d:\\work\\test.pdf"
    try (FileOutputStream os = new FileOutputStream("d:\\work\\test.pdf")) {
      // Pdfタイプのdocumentを生成する。
      Document document = new Document(PageSize.A4, 10, 10, 10, 10);
      // PdfWriterを取得する。
      PdfWriter writer = PdfWriter.getInstance(document, os);
      // documentオブジェクトをopenする。
      document.open();
      // css設定するインスタンス
      StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver();
      // Cssファイルを設定する。(css1.cssファイルをインポートする。)
      try (FileInputStream cssStream = new FileInputStream("d:\\work\\css1.css")) {
        cssResolver.addCss(XMLWorkerHelper.getCSS(cssStream));
      }
      // Cssファイルを設定する。(css2.cssファイルをインポートする。)
      try (FileInputStream cssStream = new FileInputStream("d:\\work\\css2.css")) {
        cssResolver.addCss(XMLWorkerHelper.getCSS(cssStream));
      }
      // フォント設定
      XMLWorkerFontProvider font = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
      // windowのフォントを読み込む。
      font.register("c:/windows/fonts/malgun.ttf", "MalgunGothic");
      // フォントインスタンスを生成する。
      CssAppliersImpl cssAppliers = new CssAppliersImpl(font);
      // htmlContext pipeline生成(フォントインスタンスを設定)
      HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
      htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
      // PDFのpipelineを生成
      PdfWriterPipeline pdfPipeline = new PdfWriterPipeline(document, writer);
      // Htmlのpipelineを生成する。(htmlタグ、pdfのpipeline設定)
      HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, pdfPipeline);
      // cssのpipelineをマージする。
      CssResolverPipeline cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
      // Work生成、pipeline設定
      XMLWorker worker = new XMLWorker(cssResolverPipeline, true);
      // Xmlパーサ生成(HtmlをPDFに 変換)
      XMLParser xmlParser = new XMLParser(true, worker, Charset.forName("UTF-8"));
      // 出力する。
      try (StringReader strReader = new StringReader(html)) {
        xmlParser.parse(strReader);
      }
      // ドキュメントのリソース返却
      document.close();
    } catch (Throwable e) {
      e.printStackTrace();
    }
  }
}

ソースでCSSファイルを二つ読み込みます。

body {
  /*フォント設定*/
  font-family: MalgunGothic;
}
div {
  /* div要素の背景色は赤 */
  background-color: red;
  /* フォント色は青 */
  color: blue;
}

上のCSSファイルを下記のディレクトリに設定します。


設定は完了しました。


プログラムを実行して結果を確認しましょう。


ここまでJavaでPDFを出力する方法(itextpdf)に関する説明でした。


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

最新投稿