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 件のコメント:
コメントを投稿