# 使用打印服务和属性

> 原文： [https://docs.oracle.com/javase/tutorial/2d/printing/services.html](https://docs.oracle.com/javase/tutorial/2d/printing/services.html)

从前面的课程中您了解到，Java 2D 打印 API 支持页面成像，显示打印和页面设置对话框，以及指定打印属性。打印服务是任何打印子系统的另一个关键组件。

**Java 打印服务（JPS）API** 扩展了当前的 Java 2D 打印功能，以提供以下功能：

*   应用程序通过动态查询打印机功能来发现满足其需求的打印机。
*   应用程序扩展了 JPS API 附带的属性。
*   第三方可以使用服务提供程序接口插入自己的打印服务，该接口打印不同的格式，包括 Postscript，PDF 和 SVG。

Java Print Service API 包含四个包：

<center>![This figure represents four packages necessary for printing](img/76a762eb0eca1f599ecc7ba5d0d6c628.jpg)</center>

[`javax.print`](https://docs.oracle.com/javase/8/docs/api/javax/print/package-summary.html) 包提供 Java Print Service API 的主要类和接口。它使客户端和服务器应用程序能够：

*   根据其功能发现并选择打印服务。
*   指定打印数据的格式。
*   将打印作业提交给支持要打印的文档类型的服务。

## 文件类型规格

[`DocFlavor`](https://docs.oracle.com/javase/8/docs/api/javax/print/DocFlavor.html) 类表示打印数据的格式，例如 JPEG 或 PostScript。 `DocFlavor`格式由两部分组成：MIME 类型和表示类名称。 MIME 类型描述格式，文档表示类名称指示文档如何传递到打印机或输出流。应用程序使用`DocFlavor`和属性集来查找具有属性集指定功能的打印机。此代码示例演示了如何获取`StreamPrintServiceFactory`对象数组，这些对象可以返回能够将 GIF 图像转换为 PostScript 的`StreamPrintService`对象：

```
DocFlavor flavor  = DocFlavor.INPUT_STREAM.GIF;
String psMimeType = DocFlavor.BYTE_ARRAY.
                    POSTSCRIPT.getMimeType();
StreamPrintServiceFactory[] psfactories =
              StreamPrintServiceFactory.
              lookupStreamPrintServiceFactories(
              flavor, psMimeType);

```

## 属性定义

[`javax.print.attribute`](https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/package-frame.html) 和 [`javax.print.attribute.standard`](https://docs.oracle.com/javase/8/docs/api/javax/print/attribute/standard/package-frame.html) 包定义打印属性，这些属性描述打印服务的功能，指定打印作业的要求以及跟踪打印作业的进度。

例如，如果您想使用 A4 纸张格式并打印文档的三个副本，则必须创建一组实现`PrintRequestAttributeSet`界面的以下属性：

```
PrintRequestAttributeSet attr_set =
    new HashPrintRequestAttributeSet();
attr_set.add(MediaSize.ISO_A4); 
attr_set.add(new Copies(3)); 

```

然后，您必须将属性集与`DocFlavor`一起传递给打印作业的`print`方法。

## 打印服务发现

应用程序调用抽象类`PrintServiceLookup`的静态方法来定位具有满足应用程序打印请求能力的打印服务。例如，为了打印双面文档的两个副本，应用程序首先需要找到具有双面打印功能的打印机：

```
DocFlavor doc_flavor = DocFlavor.INPUT_STREAM.PDF;
PrintRequestAttributeSet attr_set =
    new HashPrintRequestAttributeSet();
attr_set.add(new Copies(2));
attr_set.add(Sides.DUPLEX);
PrintService[] service = PrintServiceLookup.
              lookupPrintServices(doc_flavor,
              attr_set);

```

## API 的常见用途

总之，Java Print Service API 执行以下步骤来处理打印请求：

1.  选择`DocFlavor`。
2.  创建一组属性。
3.  找到可以处理`DocFlavor`和属性集指定的打印请求的打印服务。
4.  创建封装`DocFlavor`和实际打印数据的`Doc`对象。
5.  从打印服务获取由`DocPrintJob`表示的打印作业。
6.  调用打印作业的`print`方法。

有关 Java Print Service 的更多信息，请参阅 [Java 2D 打印服务 API 用户指南](https://docs.oracle.com/javase/8/docs/technotes/guides/jps/spec/JPSTOC.fm.html)。