この記事から得られる知識
java.awt.print
パッケージの全体像と、その中心となるクラス・インタフェースの役割。- テキストや図形など、基本的なコンテンツを印刷する処理フローの実装方法。
Printable
インタフェースを実装し、ページごとに描画内容をカスタマイズするテクニック。PageFormat
やPaper
クラスを用いた、用紙サイズ、向き、余白などの詳細なページ設定。Book
クラスを利用して、ページごとに異なる書式を持つ複雑な複数ページドキュメントを印刷する方法。- 部数、カラー/モノクロ、両面印刷など、
PrintRequestAttributeSet
を介した高度な印刷要求の指定。 - Swing/AWTコンポーネントの内容をそのまま印刷する簡単な方法。
- サーバーサイドアプリケーションなどで必須となる、GUIのないヘッドレス環境での印刷方法。
はじめに:Javaにおける印刷機能の標準API
Javaアプリケーションにおいて、レポート、請求書、チケット、あるいはGUIコンポーネントの表示内容など、様々な情報を物理的な紙に印刷したいという要求は頻繁に発生します。Javaプラットフォームは、このような要求に応えるため、標準APIとしてjava.awt.print
パッケージを提供しています。
このパッケージは、Java 2(JDK 1.2)で導入されて以来、Javaにおける印刷機能の根幹を担ってきました。特定のOSやプリンタドライバに依存しない、プラットフォーム独立な印刷処理を記述できるのが大きな特徴です。単純なテキスト印刷から、グラフィカルなコンテンツ、さらにはページごとに書式が異なる複雑なドキュメントの印刷まで、幅広いニーズに対応できる柔軟性と強力さを兼ね備えています。
この記事では、java.awt.print
パッケージの基本的な使い方から、ページ設定のカスタマイズ、複数ページのドキュメント印刷、GUIコンポーネントの印刷、そしてサーバーサイドでの利用まで、その機能を包括的に、そして詳細に解説していきます。サンプルコードを交えながら、一歩ずつ理解を深めていきましょう。
第1章: java.awt.printのアーキテクチャ
java.awt.print
を使いこなすためには、まずその中核をなすクラスとインタフェースの役割を理解することが不可欠です。これらのコンポーネントがどのように連携して印刷処理を実現するのかを見ていきましょう。
主要なクラスとインタフェース
印刷処理は、主に以下のクラスとインタフェースの協調動作によって成り立っています。
クラス/インタフェース | 役割 |
---|---|
PrinterJob | 印刷ジョブ全体を管理・制御する中心的なクラスです。印刷の開始、印刷ダイアログの表示、ページ設定ダイアログの表示など、印刷プロセス全体を統括します。静的メソッドgetPrinterJob() を呼び出してインスタンスを取得します。 |
Printable | 印刷する各ページの内容を描画する役割を担うインタフェースです。このインタフェースを実装し、print() メソッド内に具体的な描画処理を記述します。印刷システムは、ページをレンダリングする必要があるときにこのメソッドを呼び出します。 |
PageFormat | ページの物理的な特性(用紙サイズ、向き、印刷可能領域など)を定義するクラスです。各ページのフォーマットを記述するために使用されます。 |
Paper | PageFormat よりもさらに具体的に、用紙の物理的なサイズと印刷可能領域(マージン)を定義するクラスです。カスタム用紙サイズを作成する際に利用します。 |
Book | 複数のページを持つドキュメントを表現するためのクラスです。各ページに異なるPrintable オブジェクトやPageFormat オブジェクトを割り当てることができ、複雑なドキュメント構造に対応できます。Pageable インタフェースを実装しています。 |
Pageable | 複数ページからなるドキュメントを表すインタフェースです。Book クラスがこのインタフェースの代表的な実装です。ドキュメントのページ数、各ページのPageFormat 、Printable を取得するメソッドを定義します。 |
PrinterGraphics | Printable のprint メソッドに渡されるGraphics オブジェクトが実装するインタフェースで、現在のPrinterJob を取得する機能を提供します。 |
基本的な印刷フロー
一般的な印刷処理は、以下のステップで進行します。
PrinterJob
の取得:PrinterJob.getPrinterJob()
を呼び出し、印刷ジョブのインスタンスを生成します。Printable
の実装: 印刷したい内容を描画するロジックを持つクラスを作成し、Printable
インタフェースを実装します。中心となるのはprint()
メソッドです。- ジョブへの設定: 作成した
Printable
のインスタンスをprinterJob.setPrintable(myPrintable)
のようにして、印刷ジョブに設定します。複数ページの場合はBook
オブジェクトを作成し、printerJob.setPageable(myBook)
で設定します。 - 印刷ダイアログの表示 (任意):
printerJob.printDialog()
を呼び出すと、ユーザーがプリンタを選択したり、部数などを設定したりするための標準的な印刷ダイアログが表示されます。ユーザーが印刷をキャンセルしなかった場合、このメソッドはtrue
を返します。 - 印刷の実行: 最後に
printerJob.print()
メソッドを呼び出すと、実際の印刷が開始されます。 このメソッドが呼ばれると、印刷システムは設定されたPrintable
のprint()
メソッドをページごとに呼び出します。
第2章: シンプルなテキスト印刷 – 基本の「キ」
理論を学んだところで、早速最も基本的な例として、1ページのテキストを印刷するコードを見てみましょう。このコードは、前章で説明した基本的な印刷フローを具体的に示しています。
Printableインタフェースの実装
印刷処理の心臓部はPrintable
インタフェースのprint
メソッドです。このメソッドは3つの引数を取ります。
Graphics g
: 描画対象となるグラフィックスコンテキスト。このオブジェクトのメソッド(drawString
,drawLine
など)を使ってページに描画します。PageFormat pageFormat
: 現在のページのフォーマット。印刷可能領域の座標やサイズ(getImageableX()
,getImageableY()
,getImageableWidth()
,getImageableHeight()
)を取得できます。int pageIndex
: 印刷対象のページ番号(0から始まるインデックス)。
そして、このメソッドは2つの重要な定数のいずれかを返す必要があります。
Printable.PAGE_EXISTS
: 指定されたpageIndex
のページが正常に描画されたことを示します。Printable.NO_SUCH_PAGE
: 指定されたpageIndex
のページは存在しないことを示します。これを受け取ると、印刷システムはそれ以降のページの描画を停止します。
サンプルコード: “Hello, World!” を印刷する
import java.awt.*;
import java.awt.print.*;
public class SimpleTextPrinter implements Printable { @Override public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { // 印刷するページは1ページ目(インデックス0)のみ if (pageIndex > 0) { return NO_SUCH_PAGE; } // GraphicsをGraphics2Dにキャストして、より高度な描画機能を利用 Graphics2D g2d = (Graphics2D) g; // 描画の基準点をページの左上から、印刷可能領域の左上に移動 g2d.translate(pf.getImageableX(), pf.getImageableY()); // フォントを設定 g2d.setFont(new Font("Serif", Font.PLAIN, 12)); // テキストを描画 (x=100, y=100の位置に) g2d.drawString("Hello, World! This is my first print from Java.", 100, 100); // ページが存在することを通知 return PAGE_EXISTS; } public static void main(String[] args) { // 1. PrinterJobの取得 PrinterJob job = PrinterJob.getPrinterJob(); // 2. Printableインスタンスをジョブに設定 job.setPrintable(new SimpleTextPrinter()); // 3. 印刷ダイアログの表示 boolean doPrint = job.printDialog(); // ユーザーが「印刷」ボタンを押した場合 if (doPrint) { try { // 4. 印刷の実行 job.print(); } catch (PrinterException e) { System.err.println("印刷中にエラーが発生しました: " + e); } } }
}
ポイント:print
メソッド内で、まずpageIndex
をチェックし、処理対象外のページであればNO_SUCH_PAGE
を返すことが重要です。これにより、無限ループに陥るのを防ぎます。
第3章: ページ設定のカスタマイズ – PageFormatとPaper
デフォルトのページ設定(通常はA4縦)だけでなく、用紙サイズや向き、余白を自由にカスタマイズしたい場合も多いでしょう。その際に活躍するのがPageFormat
クラスとPaper
クラスです。
PageFormatによる向きの変更
PrinterJob
からデフォルトのPageFormat
を取得し、その設定を変更することができます。ページの向きを変更するのは非常に簡単です。
setOrientation(int orientation)
: ページの向きを設定します。引数には以下の定数を指定します。PageFormat.PORTRAIT
: 縦向き(デフォルト)PageFormat.LANDSCAPE
: 横向き
Paperによる用紙サイズと余白の指定
より詳細な設定、特に用紙サイズとマージン(印刷可能領域)の指定にはPaper
クラスを用います。
setSize(double width, double height)
: 用紙全体の物理的なサイズを1/72インチ単位で設定します。setImageableArea(double x, double y, double width, double height)
: 印刷可能な領域を1/72インチ単位で設定します。x
とy
は左上の開始座標(左マージンと上マージンに相当)、width
とheight
はその領域の幅と高さです。
作成したPaper
オブジェクトは、PageFormat
のsetPaper(Paper paper)
メソッドで適用します。
サンプルコード:B5横向きで余白を設定して印刷
import java.awt.*;
import java.awt.print.*;
public class PageSetupPrinter implements Printable { @Override public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); g2d.setFont(new Font("SansSerif", Font.BOLD, 16)); g2d.drawString("B5 Landscape with Custom Margin", 0, 20); // 印刷可能領域の枠線を描画して確認 g2d.drawRect(0, 0, (int)pf.getImageableWidth() -1, (int)pf.getImageableHeight() -1); return PAGE_EXISTS; } public static void main(String[] args) { PrinterJob job = PrinterJob.getPrinterJob(); // デフォルトのページフォーマットを取得 PageFormat pageFormat = job.defaultPage(); // 1. Paperオブジェクトを作成してB5サイズを設定 // B5: 182mm x 257mm // 1 inch = 25.4 mm, 1 point = 1/72 inch final double B5_WIDTH_MM = 182; final double B5_HEIGHT_MM = 257; final double MM_TO_POINT = 72 / 25.4; Paper paper = new Paper(); paper.setSize(B5_WIDTH_MM * MM_TO_POINT, B5_HEIGHT_MM * MM_TO_POINT); // 2. 余白を設定 (上下左右すべて20mm) final double MARGIN_MM = 20; final double MARGIN_POINT = MARGIN_MM * MM_TO_POINT; paper.setImageableArea( MARGIN_POINT, MARGIN_POINT, paper.getWidth() - (MARGIN_POINT * 2), paper.getHeight() - (MARGIN_POINT * 2) ); pageFormat.setPaper(paper); // 3. ページの向きを横に設定 pageFormat.setOrientation(PageFormat.LANDSCAPE); // カスタマイズしたPageFormatをPrintableに渡す job.setPrintable(new PageSetupPrinter(), pageFormat); if (job.printDialog()) { try { job.print(); } catch (PrinterException e) { e.printStackTrace(); } } }
}
1インチ = 25.4ミリ
の関係式を用いて換算する必要があります。上記のコードではMM_TO_POINT
という定数でこの計算を行っています。 第4章: 複数ページのドキュメント印刷 – Bookクラスの活用
レポートやマニュアルのように、複数ページにわたるドキュメントを印刷したいケースは非常に多いです。さらに、表紙だけ横向きにしたり、章ごとに異なる描画ロジックを適用したい場合もあります。このような複雑な要求に応えるのがBook
クラスです。
Book
クラスはPageable
インタフェースを実装しており、ページごとのPrintable
とPageFormat
を管理するコンテナとして機能します。
Bookクラスの基本的な使い方
Book
オブジェクトを生成し、append()
メソッドを使ってページを追加していくのが基本的な流れです。
append(Printable painter, PageFormat page)
: 指定したPrintable
とPageFormat
を持つページを1ページ追加します。append(Printable painter, PageFormat page, int numPages)
: 同じ内容のページを指定したページ数(numPages
)だけまとめて追加します。
作成したBook
オブジェクトは、PrinterJob
のsetPageable(Book book)
メソッドで印刷ジョブに設定します。
サンプルコード:表紙(横)と本文(縦)からなる2ページの印刷
この例では、表紙を描画するCoverPrinter
と、本文を描画するContentPrinter
という2つのPrintable
実装クラスを用意し、それぞれに異なるPageFormat
を適用します。
import java.awt.*;
import java.awt.print.*;
// メインクラス
public class MultiPagePrinter { public static void main(String[] args) { PrinterJob job = PrinterJob.getPrinterJob(); // --- ページフォーマットの準備 --- // 1. 表紙用の横向きフォーマット PageFormat landscapeFormat = job.defaultPage(); landscapeFormat.setOrientation(PageFormat.LANDSCAPE); // 2. 本文用の縦向きフォーマット PageFormat portraitFormat = job.defaultPage(); portraitFormat.setOrientation(PageFormat.PORTRAIT); // --- Bookオブジェクトの作成とページの追加 --- Book book = new Book(); book.append(new CoverPrinter(), landscapeFormat); // 表紙を1ページ追加 book.append(new ContentPrinter(), portraitFormat); // 本文を1ページ追加 // Bookオブジェクトをジョブに設定 job.setPageable(book); if (job.printDialog()) { try { job.print(); } catch (PrinterException e) { System.err.println("Error printing book: " + e); } } }
}
// 表紙を描画するPrintable
class CoverPrinter implements Printable { public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex >= 1) { // このPrintableは1ページのみ担当 return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); g2d.setFont(new Font("Serif", Font.BOLD, 48)); g2d.drawString("My Document", 100, 200); return PAGE_EXISTS; }
}
// 本文を描画するPrintable
class ContentPrinter implements Printable { public int print(Graphics g, PageFormat pf, int pageIndex) { if (pageIndex >= 1) { // このPrintableも1ページのみ担当 return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); g2d.setFont(new Font("SansSerif", Font.PLAIN, 10)); g2d.drawString("This is the main content of the document on page " + (pageIndex + 2) + ".", 50, 50); g2d.drawString("The content is printed in portrait orientation.", 50, 70); return PAGE_EXISTS; }
}
Book
を使う場合、各Printable
実装内のprint
メソッドにおけるpageIndex
は、そのPrintable
が担当するページの中でのインデックスになります。例えば、book.append(myPrintable, myFormat, 3)
のように3ページ追加した場合、myPrintable.print()
はpageIndex
が0, 1, 2の順で呼び出されます。ドキュメント全体のページ番号を意識する必要がある場合は、別途カウンタなどを管理する必要があります。 第5章: 高度な印刷設定 – Java Print Service APIとの連携
これまで見てきたjava.awt.print
は、Java 2D印刷APIとも呼ばれ、描画中心のAPIです。一方、Java 1.4で導入されたJava Print Service (JPS) API (javax.print
パッケージ) は、プリンタサービスの発見、属性ベースの高度な印刷要求、イベントリスニングなど、より印刷サービス自体に焦点を当てた機能を提供します。
幸いなことに、これら2つのAPIは連携して使用できます。java.awt.print
のPrinterJob
に、JPSの属性セット(PrintRequestAttributeSet
)を渡すことで、部数、両面印刷、カラー/モノクロ、ホチキス止めといった、より詳細な印刷設定を行うことが可能です。
PrintRequestAttributeSetの使い方
PrintRequestAttributeSet
は、印刷要求に関する属性をまとめるためのセットです。 具体的な実装クラスであるHashPrintRequestAttributeSet
を使い、add()
メソッドで属性を追加していきます。
主要な属性はjavax.print.attribute.standard
パッケージに定義されています。
属性クラス | 説明 | 設定値の例 |
---|---|---|
Copies | 印刷部数を指定します。 | new Copies(3) |
Sides | 両面印刷の方法を指定します。 | Sides.TWO_SIDED_LONG_EDGE (長辺とじ), Sides.TWO_SIDED_SHORT_EDGE (短辺とじ), Sides.ONE_SIDED (片面) |
Chromaticity | カラーかモノクロかを指定します。 | Chromaticity.COLOR , Chromaticity.MONOCHROME |
MediaSizeName | A4や日本のハガキなど、標準的な用紙サイズを名前で指定します。 | MediaSizeName.ISO_A4 , MediaSizeName.JAPANESE_POSTCARD |
OrientationRequested | ページの向きを指定します。PageFormat の代替として使えます。 | OrientationRequested.LANDSCAPE , OrientationRequested.PORTRAIT |
Destination | 印刷データをファイルに出力する場合のURIを指定します。 | new Destination(new File("output.prn").toURI()) |
サンプルコード:属性を指定して印刷
属性セットを作成し、PrinterJob
のprint()
メソッドに渡すことで、設定がプリンタに送られます。また、printDialog(AttributeSet)
を使うと、ダイアログの初期値を属性セットの内容で設定できます。
import java.awt.print.*;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
public class AttributePrinter { public static void main(String[] args) { // --- 属性セットの作成 --- PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); attrs.add(new Copies(2)); // 部数を2部に設定 attrs.add(Sides.TWO_SIDED_LONG_EDGE); // 両面印刷(長辺とじ) attrs.add(Chromaticity.MONOCHROME); // モノクロ印刷 attrs.add(MediaSizeName.ISO_A4); // 用紙サイズをA4に // --- PrinterJobの準備 --- PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable((g, pf, pageIndex) -> { if (pageIndex > 0) return Printable.NO_SUCH_PAGE; Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); g2d.setFont(new Font("Dialog", Font.PLAIN, 12)); g2d.drawString("Printing with Attributes!", 100, 100); g2d.drawString("Copies: 2, Sides: Two-Sided, Color: Mono", 100, 120); return Printable.PAGE_EXISTS; }); // 属性を反映した印刷ダイアログを表示 if (job.printDialog(attrs)) { try { // 印刷実行時にも属性セットを渡す job.print(attrs); } catch (PrinterException ex) { ex.printStackTrace(); } } }
}
第6章: GUIコンポーネントの印刷
アプリケーションの画面に表示されているJPanel
やJTable
などのGUIコンポーネントを、見た目そのままに印刷したい場合があります。java.awt.print
を使えば、これも簡単に実現できます。
鍵となるのは、AWT/Swingのすべてのコンポーネントが持つprint(Graphics g)
メソッドです。このメソッドは、コンポーネント自身とその子コンポーネントを描画する能力を持っています。
コンポーネントを印刷する手順
- 印刷したいコンポーネント(例:
JFrame
やJPanel
)への参照を取得します。 Printable
インタフェースを実装したクラスを作成します。- その
print
メソッド内で、引数として渡されたGraphics
オブジェクトを使い、対象コンポーネントのprint(g)
メソッドを呼び出します。
これだけで、コンポーネントの現在の表示内容が印刷ページに描画されます。用紙サイズに合わせてコンポーネントを拡大・縮小したい場合は、Graphics2D
のscale()
メソッドを使って描画スケールを調整します。
サンプルコード:JPanelの内容を印刷する
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.print.*;
public class ComponentPrinter extends JFrame { private final JPanel contentPanel; public ComponentPrinter() { setTitle("Component Print Test"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // --- 印刷対象のパネルを作成 --- contentPanel = new JPanel(); contentPanel.setLayout(new BorderLayout()); contentPanel.setBorder(BorderFactory.createTitledBorder("Print This Area")); JTextArea textArea = new JTextArea("This is a JTextArea inside a JPanel.\nIt will be printed."); contentPanel.add(new JScrollPane(textArea), BorderLayout.CENTER); JButton sampleButton = new JButton("Sample Button"); contentPanel.add(sampleButton, BorderLayout.SOUTH); add(contentPanel, BorderLayout.CENTER); // --- 印刷ボタンの作成 --- JButton printButton = new JButton("Print Panel"); printButton.addActionListener(this::printComponent); add(printButton, BorderLayout.SOUTH); } private void printComponent(ActionEvent e) { PrinterJob job = PrinterJob.getPrinterJob(); job.setJobName("Print JPanel Content"); job.setPrintable(new Printable() { @Override public int print(Graphics g, PageFormat pf, int pageNum) { if (pageNum > 0) { return Printable.NO_SUCH_PAGE; } Graphics2D g2 = (Graphics2D) g; g2.translate(pf.getImageableX(), pf.getImageableY()); // --- スケール計算 --- // パネルのサイズを用紙の印刷可能領域に合わせる double scaleX = pf.getImageableWidth() / contentPanel.getWidth(); double scaleY = pf.getImageableHeight() / contentPanel.getHeight(); double scale = Math.min(scaleX, scaleY); // 縦横比を維持 g2.scale(scale, scale); // パネルの描画メソッドを呼び出す contentPanel.print(g2); return Printable.PAGE_EXISTS; } }); if (job.printDialog()) { try { job.print(); } catch (PrinterException ex) { System.err.println(ex); } } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new ComponentPrinter().setVisible(true)); }
}
第7章: ヘッドレス環境での印刷
Webアプリケーションのバックエンドやバッチ処理など、GUI(ディスプレイやキーボード)が存在しない「ヘッドレス」環境で、帳票などを印刷したいというニーズは非常に高まっています。Javaは、ヘッドレス環境でのAWT機能の実行をサポートしており、もちろん印刷も可能です。
ヘッドレスモードの有効化
Javaアプリケーションをヘッドレスモードで実行するには、起動時にシステムプロパティjava.awt.headless
をtrue
に設定します。
java -Djava.awt.headless=true -jar myapp.jar
コード内からはGraphicsEnvironment.isHeadless()
メソッドで、現在の環境がヘッドレスかどうかを確認できます。
ヘッドレス印刷の注意点
ヘッドレス環境では、ユーザーとの対話が前提となる以下のメソッドは使用できません。呼び出すとHeadlessException
がスローされます。
PrinterJob.printDialog()
PrinterJob.pageDialog()
そのため、印刷はダイアログを介さずに直接実行する必要があります。プリンタは、デフォルトのプリンタを使用するか、Java Print Service APIを使って名前などで明示的に検索・指定します。
サンプルコード:デフォルトプリンタに直接印刷
このコードは、printDialog()
を呼び出さずに、直接print()
メソッドを実行します。ヘッドレス環境で実行すると、サーバーに設定されているデフォルトのプリンタから出力されます。
import java.awt.*;
import java.awt.print.*;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
public class HeadlessPrinter { public static void main(String[] args) { // ヘッドレス環境かどうかの確認 if (GraphicsEnvironment.isHeadless()) { System.out.println("Running in headless mode."); } else { System.out.println("Running in standard GUI mode."); } PrinterJob job = PrinterJob.getPrinterJob(); // --- プリンタの指定(オプション) --- // デフォルトプリンタ以外を使いたい場合、JPSで検索する PrintService service = PrintServiceLookup.lookupDefaultPrintService(); if (service != null) { System.out.println("Printing to default printer: " + service.getName()); try { job.setPrintService(service); } catch (PrinterException e) { // setPrintServiceは指定されたプリンタがPrintableをサポートしない場合などに例外をスロー e.printStackTrace(); } } else { System.err.println("No default printer found."); return; } job.setPrintable((g, pf, pageIndex) -> { if (pageIndex > 0) return Printable.NO_SUCH_PAGE; Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); g2d.setFont(new Font(null, Font.PLAIN, 12)); g2d.drawString("This print was initiated from a headless environment.", 100, 100); return Printable.PAGE_EXISTS; }); try { // ダイアログを表示せずに直接印刷を実行 System.out.println("Submitting print job..."); job.print(); System.out.println("Print job submitted successfully."); } catch (PrinterException e) { System.err.println("Error during printing: " + e); } }
}
まとめ
この記事では、Javaの標準印刷APIであるjava.awt.print
パッケージについて、その基本的な仕組みから応用的な使い方までを幅広く解説しました。
PrinterJob
とPrintable
を基本とするシンプルな印刷から、PageFormat
やBook
クラスを使った複雑なドキュメントレイアウト、Java Print Service APIと連携した高度な印刷設定、そしてGUIのないサーバー環境での印刷まで、このAPIが非常に柔軟で強力な機能を持っていることをご理解いただけたかと思います。
Javaにおける印刷処理は、一見すると複雑に見えるかもしれませんが、本記事で紹介したクラスやインタフェースの役割を一つひとつ理解し、サンプルコードを試すことで、着実にマスターすることができます。業務アプリケーションにおける帳票出力や、デスクトップアプリケーションの印刷機能実装など、様々な場面で本記事の内容が役立つことを願っています。