JavaプログラムからPDFを出力するライブライはいくつかありますが、今回は無償で商用利用可能なライセンスとなっているApache PDFBox(検証時最新は3.0)を検証します。
なおPDFBoxはApache Commons-Logging1.2を必要としますので、こちらも併せてダウンロードします。
今回のタスク
- Apache PDFBoxのライブラリをダウンロード
- Apache Commons-Loggingライブラリをダウンロード
- Java ServletからPDFをブラウザに返却するServletクラスを作成して検証
- PDFに出力する文字には、フォントMS明朝、MSゴシックを使ってみる
- servletを実行するOSはWindowsとする
まずはApache PDFBoxのライブラリをダウンロードします
https://pdfbox.apache.org/へアクセスします
Dowunloadをクリックします
下のほうへスクロールします
pdfbox-app-3.0.0-RC1.jarをクリックします
Apacheのサイトにリダイレクトされるので、ここでHTTPS://downloads.apache.org/をクリックします
下のほうへスクロールしていきます
pdfboxがありました。ここをクリックします
バージョンごとにまとめられています。ここで3.0.0-RC1のフォルダをクリックします
ライブラリにたどり着きました。最低限ひつような「fontbox-xxx.jar」と「pdfbox-xxx.jar」をダウンロードします。
続けて、commons-loggingのダウンロードです https://commons.apache.org/proper/commons-logging/download_logging.cgi
下へスクロールします
Binariesの中、commons-logging-1.2-bin.zipをダウンロードします
zipを解凍し、commons-logging-1.2.jarを取り出します。
最終的に、上記に示す3つのjarを使用しますので、これをビルドパスに通してください。
Java Servletを作成します(完成形は下記)
package sample01; import java.io.File; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.fontbox.ttf.TrueTypeCollection; import org.apache.fontbox.ttf.TrueTypeFont; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType0Font; @WebServlet("/S02") public class Servlet02 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/pdf"); response.setHeader("Cache-Control","pdfs"); response.setHeader("Pragma","pdfs"); try(OutputStream out = response.getOutputStream()){ createPdf(out); } } protected void createPdf(OutputStream out) throws IOException{ // 空のドキュメントオブジェクトを作成します try(PDDocument document = new PDDocument()) { // 新しいページのオブジェクトを作成します PDRectangle rectangle = PDRectangle.A4; PDPage page = new PDPage(rectangle); document.addPage(page); try (TrueTypeCollection ttcG = new TrueTypeCollection(new File("C:/Windows/Fonts/msgothic.ttc")); TrueTypeCollection ttcM = new TrueTypeCollection(new File("C:/Windows/Fonts/msmincho.ttc"))) { TrueTypeFont ttfG = ttcG.getFontByName("MS-Gothic"); PDFont fontG = PDType0Font.load(document, ttfG, true); TrueTypeFont ttfM = ttcM.getFontByName("MS-Mincho"); PDFont fontM = PDType0Font.load(document, ttfM, true); try(PDPageContentStream contentStream = new PDPageContentStream(document, page)){ //文字出力 contentStream.beginText(); contentStream.setFont(fontG, 14); contentStream.newLineAtOffset(10, rectangle.getHeight() - 40); contentStream.showText( "この文字はフォント MSゴシックです" ); contentStream.endText(); //文字出力 contentStream.beginText(); contentStream.setFont(fontM, 14); contentStream.newLineAtOffset(10, rectangle.getHeight() - 70); contentStream.showText( "この文字はフォント MS明朝です" ); contentStream.endText(); } // ドキュメントを保存します document.save(out); } } } }
ブラウザから、http://localhost:8080/sample01/S02 へアクセスします
上手く、PDFが表示できました。
PDFBoxは無償で利用できますが、GUIでフォーマットを作成したりといったものはありませんので、座標を計算してコーディングするといったひと手間が必要です。
0 件のコメント:
コメントを投稿