javax.print

接口
异常
public interface MultiDoc

接口 MultiDoc 指定某个对象的接口,该对象为 PrintJob 提供多部分打印数据。"Doc" 是一个简短、易于发音的术语,指“部分打印数据”,而 "multidoc" 指一组多个 doc。客户端向 PrintJob 传递一个实现了接口 MultiDoc 的对象,PrintJob 则在该对象上调用方法来获得打印数据。

接口 MultiDoc 提供了类似于多个 doc“链接列表”的抽象概念。一个 multidoc 对象就像该链接列表中的一个节点,包含列表中的当前 doc 和一个指向列表中下一个节点 (multidoc) 的指针。PrintJob 可以调用 multidoc 的 getDoc() 方法来获得当前的 doc。当转至下一个 doc 时,PrintJob 可以调用 multidoc 的 next() 方法来获得下一个 multidoc,它包含下一个 doc。所以访问 multidoc 的 PrintJob 代码可能如下所示:

      void processMultiDoc(MultiDoc theMultiDoc) {
          
          MultiDoc current = theMultiDoc;

          while (current != null) {
              processDoc (current.getDoc());
              current = current.next();
          }
      }
 

当然,可以满足协定的任意方式来实现接口 MultiDoc;不必在实现中使用链接列表。

要获得 multidoc PrintJob 的所有打印数据,PrintService 代理可以使用以下两种模式:

  1. interleaved 模式:从当前 multidoc 中获得 doc。从当前 doc 中获得打印数据表示形式对象。从打印数据表示形式对象中获得所有打印数据。根据当前的 multidoc 获得下一个 multidoc,重复执行该过程,直到不再有 multidoc 为止。(上述代码示例使用了交错模式。)

  2. all-at-once 模式:从当前 multidoc 中获得 doc,并将 doc 保存在列表中。根据当前的 multidoc 获得下一个 multidoc,并重复执行该过程,直到没有 multidoc 为止。然后在已保存的 doc 列表上进行迭代。从当前 doc 中获得打印数据表示形式对象。从打印数据表示形式对象中获得所有打印数据。转到列表中的下一个 doc,并重复执行该过程,直到不再有 doc 为止。
现在,考虑一个随时生成打印数据,并且不具有一次存储多份打印数据的资源的打印客户端。如果 PrintService 代理使用 all-at-once 模式来获得打印数据,则会为这种客户端造成难题;在 PrintService 代理回来处理并请求打印数据之前,该客户端必须保存所有 doc 的打印数据,而该客户端是无法这样做的。要让这种客户端正常打印,PrintService 代理必须使用 interleaved 模式。

为了解决此问题并简化客户端向 PrintJob 提供多个 doc 的设计,必需让所有支持 multidoc PrintJob 的 PrintService 代理使用 interleaved 模式来访问 MultiDoc 对象。也就是说,如果给定了 MultiDoc 对象,则 PrintService 代理将调用 getDoc() 一次或多次,直到它成功获得当前 Doc 对象为止。然后 PrintService 代理将获得当前 doc 的打印数据,在获得所有打印数据或出现不可恢复的错误之前,不会执行其他操作。如果能够继续执行其他操作,那么在 PrintService 代理成功获得下一个 MultiDoc 对象或说明没有 MultiDoc 的指示之前,PrintService 代理将接着调用 next() 一次或多次。接口 MultiDoc 的实现可以假定 PrintService 代理将使用此 interleaved 模式;对于任意其他模式的使用,未指定 MultiDoc 实现的行为。

对于同时访问同一 multidoc 的客户端线程的数目没有限制。因此,必须将接口 MultiDoc 的所有实现设计为多线程安全的。实际上,在 PrintJob 线程从 doc 列表(概念上的列表)的开始获取 doc 的同时,客户端线程可以向该列表的末尾添加 doc;只要 multidoc 对象可正确地对这些线程实现同步,这两个线程将互不干扰。


方法摘要
 Doc getDoc()
          获取当前的 doc 对象。
 MultiDoc next()
          转到包含 doc 对象序列中下一个 doc 对象的 multidoc 对象。
 

方法详细信息

getDoc

Doc getDoc()
           throws IOException
获取当前的 doc 对象。

返回:
当前的 doc 对象。
抛出:
IOException - 如果读取文档时出现错误。

next

MultiDoc next()
              throws IOException
转到包含 doc 对象序列中下一个 doc 对象的 multidoc 对象。

返回:
包含下一个 doc 对象的 Multidoc 对象,如果没有任何其他 doc 对象,则返回 null。
抛出:
IOException - 如果查找下一个文档时出现错误