Java Print Service徹底解説:javax.print.attribute.standardの全貌

この記事から得られる知識

  • Java Print Service (JPS) APIにおける `javax.print.attribute.standard` パッケージの役割と重要性
  • 印刷部数、用紙サイズ、カラー設定など、主要な印刷属性クラスの具体的な使い方
  • `PrintRequestAttributeSet` を用いて、複数の印刷設定をプログラムで一括制御する方法
  • プリンタがサポートする機能を確認し、それに応じて印刷設定を動的に変更するテクニック
  • Javaアプリケーションに実践的な印刷機能を組み込むための詳細なコード例

第1章: `javax.print.attribute.standard` とは何か?

Javaアプリケーションから印刷機能を利用するための標準APIが Java Print Service (JPS) API です。 このAPIの中核をなすのが、印刷設定を司る「属性」の概念です。 そして、その標準的な属性をまとめたパッケージが `javax.print.attribute.standard` です。

このパッケージ内のクラスを利用することで、開発者はプログラムコードから直接、印刷部数、用紙サイズ、カラー/モノクロ、両面印刷といった、ユーザーがお馴染みの印刷ダイアログで設定するような項目を細かく制御できます。 これらの標準属性の多くは、インターネット経由で印刷を行うためのプロトコルである Internet Printing Protocol (IPP) の仕様に基づいて定義されています。これにより、特定のプリンタメーカーに依存しない、汎用的な印刷制御が可能になります。

属性の4つの役割

印刷属性は、その役割に応じて4つのインタフェース(タグ)のいずれかを実装します。
  1. DocAttribute: 個々のドキュメントに適用される属性(例:ドキュメント名)。
  2. PrintRequestAttribute: 印刷ジョブ全体に適用される属性(例:部数、印刷品質)。この記事の主役です。
  3. PrintJobAttribute: 印刷ジョブの状態を示す属性(例:ジョブの状態、作成日時)。
  4. PrintServiceAttribute: 印刷サービス(プリンタ)自体の状態や情報を示す属性(例:プリンタ名、待機中のジョブ数)。
`javax.print.attribute.standard` パッケージには、これらすべての役割を持つ属性クラスが含まれています。

第2章: 基本的な印刷属性の使い方

ここでは、日常的によく利用される基本的な印刷属性クラスをいくつかピックアップし、その使い方をサンプルコードとともに詳しく解説します。

1. Copies – 印刷部数

印刷する部数を指定するための、最も基本的な属性の一つです。整数値をコンストラクタに渡してインスタンス化します。

<!-- 部数を5部に設定 -->
import javax.print.attribute.standard.Copies;
Copies copiesAttribute = new Copies(5);

2. MediaSizeName – 用紙サイズ

用紙サイズを指定します。`MediaSizeName` クラスは、ISO A4 (`ISO_A4`) や日本のB5 (`JIS_B5`) といった一般的な用紙サイズを静的な定数として提供しています。

<!-- 用紙サイズをA4に設定 -->
import javax.print.attribute.standard.MediaSizeName;
MediaSizeName mediaSizeNameAttribute = MediaSizeName.ISO_A4;

`Media` 属性ファミリーには、`MediaSizeName` の他にも、用紙の物理的なサイズ(縦横の長さ)を指定する `MediaSize` や、トレイを指定する `MediaTray` など、より詳細な設定クラスが存在します。

3. OrientationRequested – 印刷の向き

印刷の向きを「縦」または「横」で指定します。これも静的な定数として提供されています。

<!-- 印刷の向きを横向き (Landscape) に設定 -->
import javax.print.attribute.standard.OrientationRequested;
OrientationRequested orientationAttribute = OrientationRequested.LANDSCAPE;
定数説明
PORTRAIT縦向き(標準)
LANDSCAPE横向き
REVERSE_PORTRAIT逆向きの縦(180度回転)
REVERSE_LANDSCAPE逆向きの横(180度回転)

4. PrintQuality – 印刷品質

印刷の品質を「下書き」「通常」「高品質」の3段階で指定できます。

<!-- 印刷品質を高品質 (HIGH) に設定 -->
import javax.print.attribute.standard.PrintQuality;
PrintQuality qualityAttribute = PrintQuality.HIGH;
定数説明
DRAFT下書き品質。速度優先。
NORMAL通常品質。バランス型。
HIGH高品質。品質優先。

第3章: 色と両面印刷の制御

コスト削減や資料の見栄えに直結する、カラー設定と両面印刷の制御方法を見ていきましょう。

1. Chromaticity – カラー/モノクロ設定

印刷をカラーで行うか、モノクロで行うかを指定します。

<!-- 印刷をモノクロ (MONOCHROME) に設定 -->
import javax.print.attribute.standard.Chromaticity;
Chromaticity chromaticityAttribute = Chromaticity.MONOCHROME;
定数説明
MONOCHROMEモノクロ印刷
COLORカラー印刷
プリンタがカラー印刷に対応しているかどうかは、`PrintService` の `isAttributeCategorySupported(Chromaticity.class)` メソッドで確認できます。対応していないプリンタにカラー印刷を要求しても、無視されるかエラーになる場合があります。

2. Sides – 両面印刷

両面印刷や片面印刷を指定するための属性です。長辺綴じか短辺綴じかも選択できます。

<!-- 両面印刷 (長辺綴じ) を設定 -->
import javax.print.attribute.standard.Sides;
Sides sidesAttribute = Sides.DUPLEX;
定数説明
ONE_SIDED片面印刷(標準)
DUPLEX両面印刷(長辺綴じ)。「TUMBLE」の別名です。
TWO_SIDED_LONG_EDGE両面印刷(長辺綴じ)。
TWO_SIDED_SHORT_EDGE両面印刷(短辺綴じ)。

`DUPLEX` と `TWO_SIDED_LONG_EDGE` は実質的に同じものを指します。一般的には `DUPLEX` が使われることが多いです。


第4章: ジョブとドキュメントに関する属性

印刷ジョブの管理や、特定のページだけを印刷したい場合に便利な属性を紹介します。

1. JobName – 印刷ジョブ名

OSの印刷キューに表示されるジョブの名前を指定します。デバッグ時や、多数の印刷ジョブを管理するシステムで役立ちます。

<!-- 印刷ジョブ名を設定 -->
import javax.print.attribute.standard.JobName;
import java.util.Locale;
JobName jobNameAttribute = new JobName("Monthly-Report-2025-07", Locale.getDefault());

第2引数にはロケールを指定します。

2. PageRanges – ページ範囲指定

ドキュメントの一部のページのみを印刷する場合に使用します。ページの範囲を文字列または整数の配列で指定できます。

<!-- 1ページ目から5ページ目までと、8ページ目を印刷するように設定 -->
import javax.print.attribute.standard.PageRanges;
// 文字列で指定
PageRanges pageRanges1 = new PageRanges("1-5,8");
// 配列で指定
PageRanges pageRanges2 = new PageRanges(new int[][] {{1, 5}, {8, 8}});

この属性を使用するには、印刷データ形式(`DocFlavor`)がページ単位での分割をサポートしている必要があります。例えば、`DocFlavor.INPUT_STREAM.POSTSCRIPT` や `DocFlavor.SERVICE_FORMATTED.PAGEABLE` などが該当します。


第5章: 属性セットの構築と適用

これまで見てきた個々の属性は、単体では機能しません。 `PrintRequestAttributeSet` というインターフェースを実装したクラスにまとめて格納し、印刷ジョブに渡すことで初めて意味を持ちます。

一般的には、その実装クラスである `HashPrintRequestAttributeSet` を使用します。

`HashPrintRequestAttributeSet` の使い方

`HashPrintRequestAttributeSet` のインスタンスを作成し、`add()` メソッドを使って属性を次々に追加していきます。

import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.*;
import java.util.Locale;
// 1. 属性セットのインスタンスを作成
PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet();
// 2. 各種属性をインスタンス化して追加していく
attributeSet.add(new Copies(10)); // 部数: 10部
attributeSet.add(MediaSizeName.ISO_A4); // 用紙: A4
attributeSet.add(OrientationRequested.LANDSCAPE); // 向き: 横
attributeSet.add(Chromaticity.MONOCHROME); // 色: モノクロ
attributeSet.add(Sides.DUPLEX); // 両面印刷: 長辺綴じ
attributeSet.add(new PageRanges("1-3")); // ページ範囲: 1〜3ページ
attributeSet.add(new JobName("UserManual-Draft", Locale.getDefault())); // ジョブ名
// 3. この attributeSet を印刷ジョブに渡す (詳細は次章)

プリンタが属性をサポートしているか確認する

印刷要求を出す前に、対象のプリンタ(`PrintService`)が指定した属性をサポートしているかを確認することが重要です。これにより、意図しない印刷結果やエラーを防ぐことができます。

// printService は事前に取得済みの PrintService オブジェクトとする
PrintService printService = ...;
// カテゴリのサポート確認: 両面印刷(Sides)に対応しているか?
boolean isSidesSupported = printService.isAttributeCategorySupported(Sides.class);
if (isSidesSupported) { System.out.println("このプリンタは両面印刷に対応しています。"); // 値のサポート確認: 短辺綴じ(TWO_SIDED_SHORT_EDGE)に対応しているか? boolean isShortEdgeSupported = printService.isAttributeValueSupported( Sides.TWO_SIDED_SHORT_EDGE, null, null ); if(isShortEdgeSupported) { System.out.println("短辺綴じもサポートされています。"); }
} else { System.out.println("このプリンタは両面印刷に対応していません。");
}
// サポートされている値の一覧を取得する
// 例えば、サポートされている用紙サイズの一覧を取得する場合
Object supportedValues = printService.getSupportedAttributeValues(MediaSizeName.class, null, null);
if (supportedValues instanceof MediaSizeName[]) { MediaSizeName[] supportedMedia = (MediaSizeName[]) supportedValues; for (MediaSizeName media : supportedMedia) { System.out.println("サポートされている用紙サイズ: " + media.toString()); }
}

第6章: 実践的なサンプルコード

最後に、これまでの知識を総動員して、テキストファイルを実際に印刷する完全なプログラム例を示します。

このコードは以下の処理を行います。

  1. 印刷するテキストデータと、その形式(`DocFlavor`)を定義します。
  2. A4・横向き・2部という印刷属性セットを作成します。
  3. 上記の条件(テキスト印刷可能、かつ指定属性をサポート)に合うプリンタを探します。
  4. 見つかった最初のプリンタを使って、印刷ジョブを作成し、実行します。
import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class StandardAttributePrintExample { public static void main(String[] args) { // 1. 印刷データの準備 (DocFlavorとDoc) // ここでは単純なテキストを印刷する String textToPrint = "Hello, Java Print Service! \nThis is a test print using javax.print.attribute.standard."; InputStream inputStream = new ByteArrayInputStream(textToPrint.getBytes(StandardCharsets.UTF_8)); // DocFlavor: 印刷データの形式を指定 (ここではプレーンテキスト、UTF-8) DocFlavor flavor = DocFlavor.INPUT_STREAM.TEXT_PLAIN_UTF_8; Doc doc = new SimpleDoc(inputStream, flavor, null); // 2. 印刷要求属性セットの作成 (PrintRequestAttributeSet) PrintRequestAttributeSet attributeSet = new HashPrintRequestAttributeSet(); attributeSet.add(new Copies(2)); // 2部印刷 attributeSet.add(MediaSizeName.ISO_A4); // A4サイズ attributeSet.add(OrientationRequested.LANDSCAPE); // 横向き // 3. 印刷サービスの検索 (PrintServiceLookup) // 指定したデータ形式(flavor)と属性(attributeSet)をサポートするプリンタを検索 PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, attributeSet); if (services.length == 0) { System.err.println("指定された条件に合うプリンタが見つかりませんでした。"); // 条件を緩めてデフォルトプリンタを探す試み PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); if (defaultService != null) { System.out.println("デフォルトプリンタに印刷を試みます: " + defaultService.getName()); printDocument(defaultService, doc, attributeSet); } return; } // 4. 印刷ジョブの作成と実行 PrintService selectedService = services; // 最初に見つかったプリンタを使用 System.out.println("選択されたプリンタ: " + selectedService.getName()); printDocument(selectedService, doc, attributeSet); } private static void printDocument(PrintService service, Doc doc, PrintRequestAttributeSet attributes) { // DocPrintJobの作成 DocPrintJob job = service.createPrintJob(); try { // 印刷の実行 job.print(doc, attributes); System.out.println("印刷ジョブを送信しました。"); } catch (PrintException e) { System.err.println("印刷中にエラーが発生しました。"); e.printStackTrace(); } }
}
注意: このサンプルは、実行環境に適切なプリンタが設定されていることを前提としています。プリンタが見つからない場合はエラーメッセージが表示されます。また、実際のアプリケーションでは、ユーザーにプリンタを選択させるUI(`ServiceUI.printDialog`など)を用意することが推奨されます。

まとめ

`javax.print.attribute.standard` パッケージは、Javaで印刷機能を実装する上で避けては通れない、非常に強力なツールです。このパッケージを使いこなすことで、単に印刷するだけでなく、「どのように印刷するか」をアプリケーション側で完全にコントロールできるようになります。

本記事では、基本的な属性から、それらを組み合わせて利用する方法、さらには実践的なコード例までを解説しました。ここで紹介したクラス以外にも、`javax.print.attribute.standard` には数多くの属性クラスが存在します。公式のAPIドキュメントなどを参考に、ぜひご自身のアプリケーションに必要な印刷機能を探求し、実装してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です